没有得到正确的结果
问题描述:
我一直在试图删除键和对象数组,如果它不相同,并返回一个新的数组与对象。没有得到正确的结果
var all = [{banana: 1, rose: 2, mouse: 9, apple: 5}, {banana: 1, rock: 58, car: 19, apple: 5}, {banana: 1, red: 14, clue: 89, apple: 5}];
function differentKeys(arr){
var different_keys = [];
for (var i = 0; i < arr.length; i++) {
var tempObj = {};
for (var key in arr[i]) {
if (!arr[i][key] || arr[i][key] != arr[0][key] && i !== 0) {
tempObj[key] = arr[i][key];
different_keys.push(tempObj);
}
}
}
console.log(different_keys);
}
differentKeys(all);
结果期待是:
different_keys = [{rose: 2, mouse: 9}, {rock: 58, car: 19}, {red: 14, clue: 89}];
获取:
different_keys = [{rock: 58, car: 19}, {red: 14, clue: 89}];
答
你的if语句不处理,因为i !== 0
的第一要素,再加上它只是对其他元素进行比较第一个,不是彼此对立的(但是你没有看到,因为它发生在你的样本输入中,第二个和第三个对象没有任何公共密钥是不在第一个对象中)。并且它内tempObj
内for..in
当它应该这样做后for..in
。
您需要嵌套三个循环:像当前代码一样迭代输入对象的最外层循环,根据当前代码循环访问当前对象的属性的中间循环,然后将内循环检查所有其他对象以查看它们是否具有该属性。
所以也许有点像下面这样。
var all = [{banana: 1, rose: 2, mouse: 9, apple: 5}, {banana: 1, rock: 58, car: 19, apple: 5, cheese: 3}, {banana: 1, cheese: 2, red: 14, clue: 89, apple: 5}];
function differentKeys(arr) {
var result = [];
for (var i = 0; i < arr.length; i++) { // process all elements
var tempObj = {};
for (var key in arr[i]) { // process keys in current element
var found = false;
for (var j = 0; j < arr.length; j++) { // compare against other elements
if (i !== j && arr[j][key] === arr[i][key]) {
found = true;
break;
}
}
if (!found) {
tempObj[key] = arr[i][key];
}
}
result.push(tempObj);
}
return result;
}
console.log(differentKeys(all));
注:以上假定,如果两个物体具有相同名称的属性,但(像我加入到第二和第三对象cheese
属性)不同的值,你希望这些包括在结果中。还要注意,我已经改变了它,所以函数返回的结果而不是记录它们(然后我的日志函数的返回)。
或者这里是一个功能更强大的方式来实现等价逻辑 - 注意函数多少短是:
var all = [{banana: 1, rose: 2, mouse: 9, apple: 5}, {banana: 1, rock: 58, car: 19, apple: 5, cheese: 3}, {banana: 1, cheese: 2, red: 14, clue: 89, apple: 5}];
function differentKeys(arr) {
return arr.map(function(v, i) {
return Object.keys(v).reduce(function(a, c) {
if (!arr.some(function(o, j) { return i != j && v[c] === o[c]; }))
a[c] = v[c];
return a;
}, {});
});
}
console.log(differentKeys(all));
应该'arr.push(TEMPOBJ);'实际上是'different_keys .push(TEMPOBJ);'?目前你正在迭代中添加额外的项目到源数组中,所以这肯定会导致无限循环... – nnnnnn
@nnnnnn谢谢你,就是这样。但我没有得到: 'different_keys = [{rose:2,mouse:9},{rock:58,car:19},{red:14,clue:89}];' Im getting: ' different_keys = [{rock:58,car:19},{red:14,clue:89}];' 为什么? –