как перебирать несколько массивов внутри массива и фильтровать из него значение-Javascript

#javascript #extjs

#javascript #extjs

Вопрос:

Я использую фреймворк EXTJS для своего кода. ниже приведена моя структура массива:

 data = [{
  id: 22,
  rows: [{
    id: "673627",
    name: "ABS",
    address: "536street"
  }, {
    id: "333",
    name: "TEST$$",
    address: "536street"
  }, {
    id: "999",
    name: "TEST$$",
    address: "536street"
  }]

}, {
  id: 33,
  rows: [{
    id: "899",
    name: "TES",
    address: "536street"
  }, {
    id: "333",
    name: "TEST$$",
    address: "536street"
  }, {
    id: "999",
    name: "TES673",
    address: "536street"
  }]

}]
  

Теперь я хочу отфильтровать имя из этого массива, значение которого я сравниваю, скажем, с «TEST $ $».
Я делаю это;

 Ext.each(data, function(item) {
  filter = item.rows.filter(function(name) {
    return name.name === "TEST$$";
  }, this);
}, this);
console.log(filter);
  

В этом случае он возвращает только 1 совпадение, где, поскольку у меня есть 3 совпадения для этого конкретного значения. Он возвращает совпадение из последнего элемента в массиве данных, и, следовательно, я не получаю все совпадающие значения, есть идеи, как это можно зациклить, чтобы получить совпадение всех значений?

спасибо!

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

1. Вы перезаписываете filter каждый раз через цикл. Когда цикл будет завершен, переменная будет содержать только последнее значение. Поместите console.log(filter) внутрь цикла.

2. console.log(filter) внутри EXT.each цикла 😉

3. Или создайте filter массив и используйте filter.push() вместо filter = .

4. Вы говорите о возврате , но этот код ничего не возвращает, он просто выводит на консоль.

5. Какой фактический результат вы хотите получить?

Ответ №1:

Вы переназначаете filter переменную на каждой итерации по data массиву:

 filter = item.rows.filter(function(name) {
  return name.name === "TEST$$";
}, this);
  

На последней итерации есть только одно совпадение, с id of 333 , так что это единственное, которое вы видите после запуска Ext.each . Вместо этого попробуйте выполнить переход к внешнему массиву, который не перезаписывается:

 const testItems = [];
Ext.each(data, function(item) {
  const filtered = item.rows.filter(row => row.name === "TEST$$")
  testItems.push(...filtered);
});
console.log(testItems);
  

Обратите внимание, что нет необходимости передавать this контекст.

Другой вариант — flatMap сначала извлечь все rows в один массив:

 const output = data
  .flatMap(({ rows }) => rows)
  .filter(({ name }) => name === 'TEST$$');