我有两组数组:
var a = [1, 2, {a: 1, b:2}, 3];
var b = [1, {a: 1, b: 2}, 3};
如果数组 a 具有数组 b (包括对象)的全部(精确)属性和值,那么它将把 count 加 1。否则,如果数组 a 仅具有某些属性并且某些值不匹配,则它只会退出并且不执行任何操作。
举个例子:
var a = [1, 2, {a: 1, b:2}, 3];
var b = [1, {a: 1, b: 2}, 3};
// return true / count++
var a = [1, 2, 3, {a: 1, b: 4}];
var b = [1, 2, {a: 1, b: 6}, 3];
return false / no count
首先是我的程序:
for(var i = 0; i < mainArr[i]; i++){
if(arr.includes(mainArr[i])){
count++;
}
if(typeof(mainArr[i]) === 'object' && typeof(arr[i]) === 'object'){
for(var mainArrProp in mainArr[i]){
for(var arrProp in arr[i]){
if(arr[i].hasOwnProperty(mainArrProp) && arr[i][arrProp] === mainArr[i][mainArrProp]){
count++;
}
}
}
}
}
有办法解决这个问题吗?
最佳答案
如果您可以使用 es6,您可以利用一些新方法来创建一个(相对)较短的函数来执行此操作。具体来说,我们将使用数组 includes
、every
和 some
方法来检查浅对象相等性:
function getIncrementValue(set, subset) {
for (let item of subset) {
if (typeof item === "object") {
// Special case if looking at an object. I am assuming object is always shallow.
if (!set.some(otherItem => typeof otherItem === "object" && Object.keys(otherItem).length === Object.keys(item).length && Object.keys(otherItem).every(key => (key in item) && item[key] === otherItem[key]))) return 0;
} else {
if (!set.includes(item)) return 0;
}
}
return 1;
}
// So for your arrays:
var a1 = [1, 2, {a: 1, b:2}, 3];
var b1 = [1, {a: 1, b: 2}, 3];
// return true / count++
var a2 = [1, 2, 3, {a: 1, b: 4}];
var b2 = [1, 2, {a: 1, b: 6}, 3];
// return false / no count
console.log(getIncrementValue(a1, b1)) // returns 1;
console.log(getIncrementValue(a2, b2)) // returns 0;
除了检查对象相等性的一长行之外,这非常简单。但所有内容都是:
如果 set
中没有某个元素:
- 是一个对象,并且
- 该元素和当前项目具有相同数量的键,并且
- 该元素的每个键都是我们当前项目的键,并且
- 每个键的值相同
然后返回1。
关于javascript - 检查数组是否具有另一个数组的键值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48351900/