簡體   English   中英

在多個數組中查找交集

[英]Finding intersection in multiple arrays

我試圖在多個數組中找到相交值,它們在一個對象中,如下所示:

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

對象可以包含多個數組,鍵的名稱可以不同。 在描述的對象中,我只需要返回“2”。

我試圖建立在這個答案的基礎上: javascript 中的多數組交集,但我無法弄清楚,因為它使用靜態變量 (a,b,c) 作為示例。 如果有辦法用 lodash 做到這一點,我們將不勝感激,但 ES 5 中的 vanilla javascript 也可以!

您可以獲取值並使用Set#has進行Set和過濾。

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

我有一個簡單的單線方法:

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

但是由於您希望在 ES5 (ECMAScript 2009) 版本中使用它,這意味着沒有箭頭函數、沒有 includes() 和沒有使用 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);

迭代第一個屬性值(數組)並通過與剩余的屬性值進行比較來過濾掉。

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

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>

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)

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>

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 ] 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM