У меня есть массив вроде следующего, который вычисляется из другой функции, которую я не хочу изменять.
var d = [[1, 2, 3], [2, 3], [1, 3]];
Я хочу использовать _.intersection
со всеми массивами внутри указанного массива следующим образом:
var c = _.intersection(d);
// should return [3]
но _.intersection
принимает в качестве входных данных несколько параметров массива, а не массив массивов.
Я попытался сгладить массив, используя что-то похожее на Merge/flatten массив массивов в JavaScript? но он преобразует весь массив в один массив.
var merged = [].concat.apply([], d);
[1, 2, 3, 2, 3, 1, 3]; // I don't want this
Позвольте мне объяснить это подробно. У меня есть вложенный массив d
(который содержит массивы, а длина - динамическая). Теперь я хочу найти пересечение всех массивов, находящихся внутри массива d
.
Как я могу вызвать _.intersection([1, 2, 3], [2, 3], [1, 3],...)
но динамически с d
?
В ES5 вы можете использовать Function#apply
для распространения массива в параметры:
var d = [[1, 2, 3], [2, 3], [1, 3]];
var result = _.intersection.apply(_, d);
console.log(result);
<script src="/underscore-min.js"></script>
Вы можете использовать lodash _.spread
, который преобразует функцию для использования массива параметров:
var d = [[1, 2, 3], [2, 3], [1, 3]];
var result = _.spread(_.intersection)(d);
console.log(result);
<script src="/lodash.min.js"></script>
В ES6 вы можете использовать синтаксис распространения, чтобы сделать то же самое:
const d = [[1, 2, 3], [2, 3], [1, 3]];
const result = _.intersection(...d);
console.log(result);
<script src="/underscore-min.js"></script>
Ваш желаемый результат - это не структура данных, которую будет поддерживать js. Однако вы можете разрушить массивы в переменных:
let [a,b,c] = [[1, 2, 3], [2, 3], [1, 3]];
console.log(a,b,c);
Единственное допустимое представление того, что вы хотите получить, это строка. Вы можете получить точный результат, о котором вы просили :-):
let d = [
[1, 2, 3],
[2, 3],
[1, 3]
];
function createString(arr) {
let s = arr.map(el => '[${el}]').join(", ");
return 'result ${s};';
}
console.log(createString(d));
Единственный способ сделать это - поместить каждый из этих внутренних массивов в отдельную переменную. С ES6 это легко:
let d = [[1, 2, 3], [2, 3], [1, 3]];
let [arr1, arr2, arr3] = d;
// -> arr1: [1, 2, 3], arr2: [2, 3], arr3: [1, 3]
В противном случае вы можете сделать это, используя стандартный синтаксис ES5, конечно.
Единственный способ, которым вы сможете работать со всеми этими внутренними массивами с той же переменной, - использовать родительский массив, который у вас уже есть, d
.