javascript - 检查数组是否具有另一个数组的键值对

标签 javascript arrays object

我有两组数组:

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,您可以利用一些新方法来创建一个(相对)较短的函数来执行此操作。具体来说,我们将使用数组 includeseverysome 方法来检查浅对象相等性:

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/

相关文章:

javascript - 与 .addEventListener 中的 'click' 事件相反

C - 打印 char * 数组

javascript - 如何在 Javascript 中有效地匹配和分组字符串?

javascript - d3时间刻度在时间范围之前和之后添加时间间隔的百分比

javascript - 如何使用for循环来计算数字?

c# - 如果在 Linq 查询中抛出异常,则分配一个列值

javascript - 更新嵌套对象数组

javascript - 在包含对象数组的对象内定义方法(javascript)

c++ - 未定义的成员函数引用 (C++)

javascript - intel xdk 将 mySQL 数据库连接到应用程序