我一直试图删除对象的键和对象数组,如果它们不相同,则返回一个带对象的新数组。
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}];
答案 0 :(得分:0)
由于i !== 0
,你的if语句不会处理第一个元素,而且它只会将其他元素与第一个元素进行比较,而不是相互比较(但你没有看到,因为它恰好发生了对于您的示例输入,第二个和第三个对象没有任何不在第一个对象中的公共密钥。在.push()
之后应该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));
属性),那么您希望结果中包含这些属性。另请注意,我已经更改了它,因此函数返回结果而不是记录它们(然后是日志函数的返回)。
或者这是用更多功能方法实现的等效逻辑 - 注意函数的缩短程度:
axis.scale().ticks()