У меня есть такой простой массив:
const test = [{
test: 1,
key: [{
yes: true,
no: null
},{
yes: true,
no: null
},{
yes: false,
no: null
}]
},
{
test: true,
key: [{
yes: true,
no: null
}]
},
{
test: null,
key: [{
yes: null,
no: null
}]
}
];
И я хочу вернуть массив, который будет включать только те элементы, для которых test
является правдивым (например, 1). А массив key
внутри test
будет включать только объекты с истинным значением для key.yes
.
Итак, ожидаемый результат:
[
{
test: 1,
key: [{yes: true, no: null},{yes: true, no: null}]
},
{
test: true,
key: [{yes: true, no: null}]
}
];
Я попытался добиться этого с помощью такого простого фильтра:
const filtered = test.filter(obj => obj.test && obj.key.filter(item => item.yes).length > 0)
но это также возвращает значения массива key
, которые являются false
.
Есть идеи, почему?
@NinaScholz Новый массив отлично подходит, поэтому я попытался использовать .filter
Вам также придется отфильтровать каждый отдельный массив key
.
// array where `test` is truthy
const filtered = test.filter(({ test }) => !!test);
// array where sub-arrays are filterd
const final = filtered.map(({ key }) => key.filter(({ yes }) => !!yes));
Вам нужно получить новый внешний массив и новые внутренние массивы, потому что внешняя фильтрация не меняет внутренние массивы. Если вы измените внутренний массив и отфильтруете внешний массив, вы измените данные.
Для получения независимого результата вы можете проверить test
и, если правда, отфильтровать key
и получить новый объект для набора результатов.
var test = [{ test: 1, key: [{ yes: true, no: null }, { yes: true, no: null }, { yes: false, no: null }] }, { test: true, key: [{ yes: true, no: null }] }, { test: null, key: [{ yes: null, no: null }] }],
result = test.reduce((r, { test, key }) => {
if (test) {
r.push({ test, key: key.filter(({ yes }) => yes) });
}
return r;
}, []);
console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Вы должны сначала отфильтровать основной массив, а затем переназначить его на новый поддиапазон фильтрации, например:
const filtered = test
.filter(obj => obj.test && obj.key.some(item => item.yes))
.map(d => {d.test, key: d.key.filter(item => item.yes));
Или, возможно, отфильтруйте массив по ключу. Да через мгновение:
const filtered = test
.filter(obj => obj.test)
.map(d => {d.test, key = d.key.filter(item => item.yes))
.filter(s => s.key);
вы хотите новый массив с новым массивом ключей или изменить старый?