Как получить пересечение массивов во вложенном массиве

1

У меня есть массив вроде следующего, который вычисляется из другой функции, которую я не хочу изменять.

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?

Теги:
arrays
underscore.js

3 ответа

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

В ES5 вы можете использовать Function#apply для распространения массива в параметры:

var d = [[1, 2, 3], [2, 3], [1, 3]];

var result = _.intersection.apply(_, d);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/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="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

В ES6 вы можете использовать синтаксис распространения, чтобы сделать то же самое:

const d = [[1, 2, 3], [2, 3], [1, 3]];

const result = _.intersection(...d);

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
  • 0
    спасибо приятель, это сработало @Ori
  • 0
    Добро пожаловать :) Какой метод вы использовали?
Показать ещё 3 комментария
2

Ваш желаемый результат - это не структура данных, которую будет поддерживать 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));
  • 1
    но длина вложенного является динамической, так что это решение неосуществимо
  • 0
    Обновленный ответ полезен
0

Единственный способ сделать это - поместить каждый из этих внутренних массивов в отдельную переменную. С 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.

Ещё вопросы

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