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

时间:2017-06-06 16:45:22

标签: javascript arrays underscore.js

我有一个类似下面的数组,它是从另一个我不想修改的函数计算出来的。

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

3 个答案:

答案 0 :(得分: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>
&#13;
&#13;
&#13;

你可以使用lodash&#39; s _.spread来转换函数以使用一组参数:

&#13;
&#13;
var d = [[1, 2, 3], [2, 3], [1, 3]];

var result = _.spread(_.intersection)(d);

console.log(result);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;

在ES6中,您可以使用spread syntax执行相同的操作:

&#13;
&#13;
const d = [[1, 2, 3], [2, 3], [1, 3]];

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

console.log(result);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
&#13;
&#13;
&#13;

答案 1 :(得分: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));

答案 2 :(得分: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