уплощение массива? [] .Concat (... [массив])? - PullRequest
4 голосов
/ 01 мая 2020

Я понимаю, что [].concat(...array) сгладит массив массивов, но я проходил курс веб-пакета, и в коде для загрузки пресетов он использует синтаксис [].concat(...[array])

Мое понимание этого это:

const array = [[1,2,3], [4,5,6], [7,8,9]];
const result = [].concat(...array);       // [1,2,3,4,5,6,7,8,9]
const result2 = [].concat(...[array]);    // [[1,2,3], [4,5,6], [7,8,9]]

Это определенно сбивает меня с толку, потому что код курса (ниже) работает, но я не вижу, чего достигает [].concat(...[array])?

const webpackMerge = require("webpack-merge");

const applyPresets = (env = {presets: []}) => {
  const presets = env.presets || [];
  /** @type {string[]} */
  const mergedPresets = [].concat(...[presets]);
  const mergedConfigs = mergedPresets.map(presetName =>
    require(`./presets/webpack.${presetName}`)(env)
  );

  return webpackMerge({}, ...mergedConfigs);
};

module.exports = applyPresets;

Может кто-нибудь дать мне смутная идея, пожалуйста?

Ответы [ 2 ]

2 голосов
/ 01 мая 2020

Это немного странно.

метод concat() берет каждый элемент из нескольких массивов и добавляет их в новый массив. Итак,

[].concat([1],[2],[3]) = [1, 2, 3]

Теперь синтаксис [somevariable] помещает somevariable в массив.

let arr1 = [1, 2, 3, 4]
let arr2 = [arr1]
console.log(arr2) // prints [[1, 2, 3]]

И, наконец, синтаксис ... ( называется расширенным синтаксисом). ) по существу разбирает массив, поэтому к его элементам можно получить прямой доступ

function myFunc(...[x, y, z]) {
  return x * y* z; // without the dots, we'd have to say arr[0] * arr[1] * arr[2]
}

Таким образом, выражение [].concat(...[array]), в котором вы запутались, действительно ничего не дает; он помещает array в другой массив с синтаксисом [], а затем немедленно разбирает его обратно, как это было с синтаксисом .... Эквивалентное выражение - [].concat(array), что не достигает sh, так как имеет единственный аргумент и метод contact() вызывается для пустого массива.

1 голос
/ 01 мая 2020

Позвольте мне начать с того, что я понятия не имею, почему используется оператор распространения. Насколько я знаю, [].concat(...[presets]) эквивалентно [].concat(presets).

Однако [].concat(presets), вероятно, используется для нормализации presets. Если presets уже является массивом, то это не делает ничего, кроме создания неглубокой копии.

Если presets не является расширяемым в параллельном режиме (свойство Symbol.isConcatSpreadable установлено в ложное значение значение), как "foo", то он преобразуется в массив с одним элементом, и на выходе будет ["foo"].

Если существуют настраиваемые типы данных, которые можно расширять (имеет Symbol.isConcatSpreadable свойство установлено в истинное значение), но не все методы массива. С помощью этого метода его можно преобразовать в массив размером presets.length.

Поскольку выходные данные всегда являются массивом, методы, такие как map (mergedPresets.map), можно использовать, не беспокоясь о типе presets.

const normalize = presets => [].concat(presets);

console.log(normalize(["foo"]));
console.log(normalize("foo"));
console.log(normalize({
  0: "foo",
  length: 1,
  [Symbol.isConcatSpreadable]: true
}));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...