сопоставлять / фильтровать значения объектов, если ключ итерации находится в массиве

#javascript #arrays #object

#javascript #массивы #объект

Вопрос:

Мне нужно отфильтровать значение объектов в новый массив amp;amp; передать это значение в массив только в том случае, если его ключ найден в массиве // Я почти уверен, что найдется способ сделать это, я просто пытаюсь применить его к моей текущей модели.

Приведенный ниже пример того, с чем я пытался работать

Файл JSON содержит массив объектов —

Я отфильтровал выбранный объект и сохранил его ключи в отдельном массиве (за вычетом некоторых, которые мне не нужны):

 let labelValues = () => {
                // Filter the JSON data to remove not wanted
                // This is explicit so will need to be written to be dynamic
                // Data also is apearing out of context
                return Object.keys(data[0]).filter((e)=>{
                    if(e == 'COMPANY' || e == 'HEADQUARTERS' || e == 'TOTAL'){
                        return false
                    }
                    return true
                })
            }
  

Это оставляет меня с:

 let X = ["JANUARY", "FEBUARY", "APRIL", "MARCH", "FEBUARY_1", "MAY"]
  

Теперь мне нужно создать новый массив — путем повторения объекта и передачи значения в массив только в том случае, если КЛЮЧ объектов находится в вышеупомянутом массиве X

Пример структуры данных объекта:

 let obj = {
APRIL: 35
COMPANY: "Walmart"
FEBUARY: 34
FEBUARY_1: 9
HEADQUARTERS: "Bentonville, AR"
JANUARY: 22.6
MARCH: 23.4
MAY: 21.1
TOTAL: 145.1
}
  

желаемый массив будет:

 [35,34,9,22.6,23.4,21.1]
  

Заранее спасибо —
Уолли

Комментарии:

1. Нет — извините, это была опечатка с моей стороны — я обновлю

Ответ №1:

for цикл можно использовать для перехода по ключам объекта и добавления значений :

 var obj = { APRIL: 35, COMPANY: "Walmart", FEBUARY: 34, FEBUARY_1: 9,
  HEADQUARTERS: "Bentonville, AR", JANUARY: 22.6, MARCH: 23.4, MAY: 21.1, TOTAL: 145.1 }

var arr = []

for (var key in obj)
  if (key !== 'COMPANY' amp;amp; key !== 'HEADQUARTERS' amp;amp; key !== 'TOTAL')
    arr.push(obj[key])
    
console.log( JSON.stringify( arr ) )
console.log( '[35,34,9,22.6,23.4,21.1]' )  

Это также можно сделать во время синтаксического анализа :

 var json = '{"APRIL":35,"COMPANY":"Walmart","FEBUARY":34,"FEBUARY_1":9,"HEADQUARTERS":"Bentonville, AR","JANUARY":22.6,"MARCH":23.4,"MAY":21.1,"TOTAL":145.1}'

var arr = []
JSON.parse(json, (k, v) => !isNaN(v) amp;amp; k !== 'TOTAL' amp;amp; arr.push(v))
    
console.log( JSON.stringify( arr ) )  

Ответ №2:

Итак, в этом случае:

 let values = obj.map((item)=>{
// if items key is not found do not pass it to the new array
if(item.Object.key != X){
return false
}
return item
})
  

Это оставило бы вас с массивом истинных / ложных значений.

Вот короткий фрагмент кода, который я написал, который должен делать то, что вы хотите, чтобы он делал:

 const obj = {
  APRIL: 35,
  COMPANY: 'Walmart',
  FEBUARY: 34,
  FEBUARY_1: 9,
  HEADQUARTERS: 'Bentonville, AR',
  JANUARY: 22.6,
  MARCH: 23.4,
  MAY: 21.1,
  TOTAL: 145.1,
};

const notInclude = ['COMPANY', 'HEADQUARTERS', 'TOTAL'];

let labelValues = () => {
  return Object.keys(obj).filter((val) => !notInclude.includes(val));
};

const data = labelValues();
const result = data.map((val) => obj[val]);

console.log(data);
console.log(result);  

Это должно сработать, но дайте мне знать, если это не имеет смысла!

Комментарии:

1. Привет, Грэм — Это удивительно для вашего ввода, однако, похоже, что это не сработало так, как задумано — я отредактировал свой вопрос, чтобы уточнить результат, который я ищу. Еще раз спасибо за ваш вклад (также дайте мне знать, если я ошибаюсь, и вышеупомянутое работает в этом контексте) — еще раз спасибо — W

2. Я смотрю на это и теперь думаю, потому что это OBJ, мне нужно сначала создать массив, а затем вставить () значение в массив, если ключ найден?

3. @Wally Взгляните на это и дайте мне знать, имеет ли это больше смысла!

4. Да, это решает проблему более плавным способом, чем у меня: P спасибо за вашу помощь 🙂

Ответ №3:

Хорошо, итак, я понял это …. и теперь я чувствую себя несколько глупо, что ответ так прост….

в основном —

создайте новый массив, т.е.

пусть array = []

затем со значениями ключей запустите forEach для этого, перенося данные в новый массив, т.Е.

 values.forEach(value => {
    array.push(data[0][value])
})
  

Кстати, данные [0] будут динамическими — просто используйте их в качестве ссылки на данный момент

ГЛУПЫЙ, ГЛУПЫЙ Я!

спасибо за вашу помощь