假设有两个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};
答案 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.values
和Object.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.assign
和Object.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);