Как сократить код JavaScript, который имеет оператор if в массиве распространения - PullRequest
0 голосов
/ 09 февраля 2019

Есть ли способ сократить это выражение if в функции приведения.Я попытался использовать

acc = [...acc, v || ''];

, но это просто добавляет пустую строку.

Object.entries(props).reduce((acc, [k, v]) => {
    if (v) {
      acc = [...acc, v];
    }
    return acc;
  }, []);

Я также хочу не использовать k в [k, v], потому что Линтер сходит с ума.Как не использовать переменную k, но все равно получить значение переменной?

Ответы [ 5 ]

0 голосов
/ 09 февраля 2019

Вы делаете здесь ненужные операции: вы в основном создаете новый массив каждый цикл сокращения, и вы размещаете элемент предыдущего поверх него, просто чтобы добавить элемент в конце!Это в основном то, что делает метод push, так что вы можете просто использовать это:

Object.values(props).reduce((acc, v) => (v && acc.push(v), acc), []);
0 голосов
/ 09 февраля 2019
acc = [...acc, ...(v? [v] : [])]

Вы можете использовать такую ​​комбинацию синтаксиса распространения, как это.

Хитрость в том, что ... для пустого массива ничего не будет делать:

 [...[]] --> []

 [1, 2, 3, ...[]] --> [1, 2, 3]
0 голосов
/ 09 февраля 2019

Используйте троичное выражение.Вы можете использовать деструктуризацию массива, чтобы пропустить ключ) будет использовать Object.values() и Array.filter() с Boolean, чтобы получить тот же результат:

Object.values(props).filter(Boolean);
0 голосов
/ 09 февраля 2019

Я думаю, что самый простой способ - использовать .concat(), например, так:

Причина, по которой это работает, заключается в том, что concat (в отличие от push) передает содержимое массива другомумассив, а не сама ссылка на массив.Конкатенируя пустой массив, это, по сути, невозможно, если v является ложным.Это желаемый функционал, да?

var arr = [1,2,3];
var v = null;
var x = 4;
arr = arr.concat(v || []);
console.log(arr);
arr = arr.concat(x || []);
console.log(arr);

В вашем конкретном случае:

Object.entries(props).reduce((acc, [k, v]) => acc.concat(v || []), []);
0 голосов
/ 09 февраля 2019

Вы можете взять пустой массив в качестве значения по умолчанию и использовать concat, который разрешает пустой массив как нейтральное значение.

Для получения элемента по известному индексу вы можете деструктурировать массив, взявindex.

result = Object
    .entries(props)
    .reduce((acc, { 1: v }) => acc.concat(v || []), []);

Более короткая версия должна принимать только значения.

result = Object
    .values(props)
    .reduce((acc, v) => acc.concat(v || []), []);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...