在多个数组中查找交集

时间:2019-03-24 10:40:56

标签: javascript arrays lodash intersection

我试图在对象中的多个数组中找到相交的值,如下所示:

object = {
  filterA: ["1","2","3","4"],
  filterB: ["2","5","6","7"],
  filterN: ["2","4","7"]
}

对象可以容纳多个数组,并且键的名称可以不同。在所描述的对象中,我只需要返回“ 2”即可。

我尝试建立在以下答案上:Multiple array intersection in javascript,但由于在示例中使用了静态变量(a,b,c),因此我无法弄清楚。如果有办法用lodash做到这一点,将不胜感激,但是ES 5中的香草javascript也可以做到!

7 个答案:

答案 0 :(得分:2)

您可以获取值并使用Set并使用Set#has进行过滤。

var object = { filterA: ["1", "2", "3", "4"], filterB: ["2", "5", "6", "7"], filterN: ["2", "4", "7"] },
    result = Object
        .values(object)
        .reduce((a, b) => b.filter(Set.prototype.has, new Set(a)));

console.log(result);

答案 1 :(得分:1)

迭代第一个属性值(数组)并通过与剩余属性值进行比较来过滤掉。

// get property values(arraya as array)
let arr = Object.values(object);


let res = arr[0]
  // iterate over first array
  // check value present in remaining object values(arrays)
  .filter(v => arr.slice(1).every(a => a.includes(v)));

let object = {
  filterA: ["1", "2", "3", "4"],
  filterB: ["2", "5", "6", "7"],
  filterN: ["2", "4", "7"]
};


let arr = Object.values(object);

let res = arr[0].filter(v => arr.slice(1).every(a => a.includes(v)));


console.log(res)

答案 2 :(得分:1)

reduce将为您完成这项工作。在下面查看我的代码。

var object = {
  filterA: ["1","2","3","4"],
  filterB: ["2","5","6","7"],
  filterN: ["2","4","7"]
}

var res = Object.values(object).reduce(function (acc, array) {
  return _.intersection(acc, array)
})

console.log(res)
<script src="https://cdn.jsdelivr.net/npm/lodash@4.17.11/lodash.min.js"></script>

答案 3 :(得分:0)

object = {
  filterA: ["1","2","3","4"],
  filterB: ["2","5","6","7"],
  filterN: ["2","4","7"]
}

let arr = Object.values(object);

let res = arr[0].filter(v => arr.slice(1).every(a => a.includes(v)));


console.log(res)

答案 4 :(得分:0)

我有一个简单的单线方法:

const res = Object.values(object).reduce((a, b) => a.filter(i => b.includes(i)))

但是,由于您希望在ES5(ECMAScript 2009)版本中使用它,因此这意味着没有箭头功能,没有include()和Set对象的使用。

const res = Object.values(object).reduce(function (a, b) { 
  return a.filter(function(i) {
    //return b.includes(i);
    return b.indexOf(i) >= 0;
  });
});

console.log(res);

答案 5 :(得分:0)

Lodash的_.intersection()可以处理多个数组。您可以使用_.flow()创建一个函数,该函数使用_.values()从对象获取数组数组,并使用_.intersection()_.spread()来计算交集。

const { flow, values, spread, intersection } = _

const fn = flow(
  values, // get the arrays
  spread(_.intersection) // spread into intersection
)

const object = {
  filterA: ["1","2","3","4"],
  filterB: ["2","5","6","7"],
  filterN: ["2","4","7"]
}

const result = fn(object)

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.js"></script>

答案 6 :(得分:0)

let arrayOfComparisonArrays = [[1,2,3,4,5], [5,3], [1,3,4,5], [5,1,3]]
let intersectionArray

intersectionArray = arrayOfComparisonArrays.reduce((lastArray, nextArray)=>{
    let intersection = lastArray.filter(x => nextArray.includes(x))
    return intersection
})

//intersectionArray: [ 3, 5 ]