У меня такой простой массив:
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
.
Любые идеи почему?
Вам нужно получить новый внешний массив и новые внутренние массивы, потому что внешняя фильтрация не изменяет внутренние массивы. Если вы мутируете внутренний массив и фильтруете внешний массив, вы мутируете данные.
Для получения независимого результата вы можете проверить 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.log(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));
Или, возможно, фильтр через key.yes через мгновение:
const filtered = test
.filter(obj => obj.test)
.map(d => {d.test, key = d.key.filter(item => item.yes))
.filter(s => s.key);
Вам также придется фильтровать каждый отдельный массив 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));
.filter