#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$$');