如何获取嵌套数组中数组的交集

How to get intersection of the arrays in a nested array

我有一个如下所示的数组,它是从另一个我不想修改的函数计算得到的。

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

我想将 _.intersection 与上述数组中的所有数组一起使用,如下所示:

var c = _.intersection(d);
// should return [3]

_.intersection将多个数组参数作为输入,而不是数组的数组。

我曾尝试使用类似于 Merge/flatten an array of arrays in 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

您想要的结果不是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

在 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 中你可以使用 spread syntax 做同样的事情:

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>