Как вернуть условные массивы из массива объектов? - PullRequest
1 голос
/ 04 августа 2020

Мне интересно, можно ли достичь нижеприведенного более чистым / более эффективным способом?

const data = [
    { active: false },
    { active: false },
    { active: true },
    { active: false },
    { active: true },
]

const split = (data) => {
    const activeData = data.filter(({active}) => active).map(element => 1)
    const inactiveData = data.filter(({active}) => !active).map(element => 0)

    return [
        activeData,
        inactiveData,
    ]
}

console.log(split(data))

Проблема здесь, я думаю, в том, что этот подход неэффективен, потому что он дважды фильтрует и отображает один и тот же массив. Есть ли способ сделать это только один раз?

Ответы [ 3 ]

1 голос
/ 04 августа 2020

Если ваш массив не огромен, это не будет иметь никакого значения. Однако вы действительно можете сделать это за один проход по массиву:

    const split = (data) =>
      data.reduce((rv, entry) => 
        (rv[+!entry.active].push(+entry.active), rv)
      , [[], []]);
      
    console.log(split([{active: true}, {active: false}, {active: false}]))

Операторы + преобразуют логические значения в числа (0 или 1). Параметр «rv» для обратного вызова .reduce() - это «возвращаемое значение» или аккумулятор, в который обратный вызов .reduce() формирует результат. В этом коде обратный вызов использует флаг «активный» (инвертированный) для выбора либо первого массива (индекс 0), либо второго массива (индекс 1) в «массиве массивов» аккумулятора. Затем значение, помещенное в выбранный массив, равно 0 или 1, снова полученное из «активного» значения путем преобразования его в число.

0 голосов
/ 04 августа 2020

У вас есть довольно простой способ сделать это, однако использование нескольких функций массива требует большего количества циклов над данными.

Reduce позволит нам сделать это только один раз.

const data = [
    { active: false },
    { active: false },
    { active: true },
    { active: false },
    { active: true },
]

const split = (data) =>
  data.reduce((acc, {active}) => acc[+!active].push(+active) && acc, [[],[]])

console.log(split(data))
0 голосов
/ 04 августа 2020

Вы можете взять один l oop и уменьшить массив, используя объект в качестве цели.

const
    data = [{ active: false }, { active: false }, { active: true }, { active: false }, { active: true }],
    { true: activeData, false: inactiveData } = data.reduce((r, { active }) =>
        (r[active].push(+active), r),
        { true: [], false: [] }
    );

console.log(activeData);
console.log(inactiveData);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...