Фильтровать вложенный массив по определенному значению

1

У меня такой простой массив:

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.

Любые идеи почему?

  • 0
    Вы хотите новый массив с новым массивом ключей или изменить старый?
  • 0
    @NinaScholz Новый массив в порядке, поэтому я попытался использовать .filter
Теги:
arrays

3 ответа

2
Лучший ответ

Вам нужно получить новый внешний массив и новые внутренние массивы, потому что внешняя фильтрация не изменяет внутренние массивы. Если вы мутируете внутренний массив и фильтруете внешний массив, вы мутируете данные.

Для получения независимого результата вы можете проверить 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; }
  • 0
    Потрясающие! Это работает так, как и ожидалось, спасибо!
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);
0

Вам также придется фильтровать каждый отдельный массив 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));

Ещё вопросы

Сообщество Overcoder
Наверх
Меню