JavaScript识别对象差异

时间:2017-05-10 14:10:39

标签: javascript jquery

假设有两个JS对象如下:

var object1 = {0: 100, 1: 101, 2: 102, 3: 103, 4: 104, 5: 105, 6: 106};
var object2 = {0: 100, 1: 103, 2: 105};

object1包含可用于项目ID的所有可接受值。 object2包含已在数据库中使用的项ID。如何比较这两个对象以创建包含尚未使用的项ID的第三个对象?尚未使用的项目ID将作为下拉框的选项。

我宁愿不将对象转换为数组来解决这个问题。这个例子的期望结果是:

var result  = {0: 101, 1: 102, 2: 104, 3: 106};

3 个答案:

答案 0 :(得分:0)

我不知道为什么你不会使用数组,但这里有一个让你最终得到一个Object的hacky解决方案:

var arrObj2 = Object.values(object2);
var result = {};
Object.values(object1).filter(function(item) { return arrObj2.indexOf(item) === -1;})
      .forEach(function(item,index) {result[index] = item;});
console.log(result);

答案 1 :(得分:0)

你选择属性名称,因为Arrays会为你选择它们,所以你想坚持使用普通对象是很奇怪的。

以下是如何在一个赋值中执行此操作,使用Set进行快速查找,使用Object.valuesObject.assign在数组和普通对象之间切换:

var object1 = {0: 100, 1: 101, 2: 102, 3: 103, 4: 104, 5: 105, 6: 106};
var object2 = {0: 100, 1: 103, 2: 105};

var a = Object.assign({}, Object.values(object1).filter(function (val) {
    return !this.has(val);
}, new Set(Object.values(object2))));

console.log(a);

如果您使用数组,则可以跳过对Object.assignObject.values的调用,并执行此操作:

var arr1 = [100, 101, 102, 103, 104, 105, 106];
var arr2 = [100, 103, 105];

var a = arr1.filter(function (val) {
    return !this.has(val);
}, new Set(arr2));

console.log(a);

答案 2 :(得分:0)



var object1 = {0: 100, 1: 101, 2: 102, 3: 103, 4: 104, 5: 105, 6: 106};
var object2 = {0: 100, 1: 103, 2: 105};
//var result  = {0: 101, 1: 102, 2: 104, 3: 106};
var i,
    ii,
    iii = 0,
    result = {};
for(i in object1){
  for(ii in object2){
    if(object1[i] == object2[ii]){
      break;
    }
  }
  if(object1[i] != object2[ii]){
    result[iii] = object1[i];
    iii+=1;
  }
}
console.log(result);