在多个数组中查找交集
Finding intersection in multiple arrays
我正在尝试在对象内的多个数组中找到相交值,如下所示:
object = {
filterA: ["1","2","3","4"],
filterB: ["2","5","6","7"],
filterN: ["2","4","7"]
}
对象可以包含多个数组,键的名称可以不同。在所描述的对象中,我只需要返回“2”。
我试图建立在这个答案的基础上: 但我无法弄明白,因为它使用静态变量 (a,b,c) 作为示例。如果有办法用 lodash 做到这一点,我们将不胜感激,但 ES 5 中的香草 javascript 也可以!
遍历第一个 属性 值(数组)并通过与剩余的 属性 值进行比较来过滤掉。
// 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)
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)
您可以获得这些值并取 Set
and filter with 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);
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>
我有一个简单的单行方法:
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);
Lodash 的 _.intersection()
can handle multiple arrays. You can create a function with _.flow()
that gets an array of arrays from the object with _.values()
, and computes the intersection by using _.intersection()
with _.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 ]
我正在尝试在对象内的多个数组中找到相交值,如下所示:
object = {
filterA: ["1","2","3","4"],
filterB: ["2","5","6","7"],
filterN: ["2","4","7"]
}
对象可以包含多个数组,键的名称可以不同。在所描述的对象中,我只需要返回“2”。
我试图建立在这个答案的基础上:
遍历第一个 属性 值(数组)并通过与剩余的 属性 值进行比较来过滤掉。
// 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)
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)
您可以获得这些值并取 Set
and filter with 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);
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>
我有一个简单的单行方法:
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);
Lodash 的 _.intersection()
can handle multiple arrays. You can create a function with _.flow()
that gets an array of arrays from the object with _.values()
, and computes the intersection by using _.intersection()
with _.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 ]