【问题标题】:Finding intersection in multiple arrays在多个数组中查找交集
【发布时间】:2019-03-24 10:40:56
【问题描述】:

我正在尝试在多个数组中查找相交值,这些数组位于一个对象中,如下所示:

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 中的 vanilla javascript 也可以!

【问题讨论】:

标签: javascript arrays lodash intersection


【解决方案1】:

您可以获取值并使用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);

【讨论】:

  • 过滤器的this很好用。
  • 在检查了 lodash 解决方案的值之后,我最终决定使用这个解决方案,最初是好的,但一段时间后由于某种原因产生了错误的值。我用在线 babel (babeljs.io/repl) 转译了答案,因为我使用的系统不转译 es6。
【解决方案2】:

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

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);

【讨论】:

  • 嗨@wentjun,你能给我一个ES5解决方案(没有箭头功能)
  • includes 在没有 polyfill 的 ES5 环境中可能不可用
  • 哦,对了!感谢@charlietfl,我已将包含替换为 indexOf() >= 0 以检查该元素是否存在于数组中。
  • @PresianNedyalkov 好的,我已经编辑了一次
【解决方案3】:

遍历第一个属性值(数组)并通过与剩余属性值比较过滤掉。

// 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)

【讨论】:

  • 嗨@Pranav你能给我一个没有箭头功能的ES5版本
  • @PresianNedyalkov:当然
  • @PresianNedyalkov arr[0] .filter(function(v){ return arr.slice(1).every(function(a){ return a.includes(v)}) });
【解决方案4】:

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>

【讨论】:

    【解决方案5】:
    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)
    

    【讨论】:

    • 嗨@umer,你能给我一个ES5解决方案(没有箭头功能)
    • 试试这个:arr[0] .filter(function(v){ return arr.slice(1).every(function(a){ return a.includes(v)}) });
    【解决方案6】:

    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>

    【讨论】:

      【解决方案7】:
      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 ] 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-26
        • 2021-12-06
        • 1970-01-01
        • 2020-07-08
        • 2019-03-28
        • 1970-01-01
        • 2013-09-10
        • 2012-05-12
        相关资源
        最近更新 更多