【问题标题】:I'm getting wrong output in Javascript Function?我在 Javascript 函数中得到错误的输出?
【发布时间】:2021-08-30 02:15:28
【问题描述】:
我有一个函数,它查看对象数组(第一个参数)并返回一个包含匹配名称和值对的所有对象的数组(第二个参数)。如果要包含在返回的数组中,源对象的每个名称和值对都必须存在于集合中的对象中。
function whatIsInAName(collection, source) {
let keyArr = Object.keys(source);
for (let i = 0; i < keyArr.length; i++) {
var arr = collection.filter(function(item) {
return item.hasOwnProperty(keyArr[i])
})
}
return arr.filter(function(item) {
for (let g = 0; g < keyArr.length; g++) {
return item[keyArr[g]] === source[keyArr[g]];
}
});
}
console.log(whatIsInAName([{
"a": 1,
"b": 2,
"c": 3
}], {
"a": 1,
"b": 9999,
"c": 3
}));
我应该给一个空数组[ ]。
但它给了[{"a": 1, "b": 2, "c": 3}]
【问题讨论】:
标签:
javascript
arrays
algorithm
function
object
【解决方案1】:
您的第二个过滤器出现错误。
在for 语句中,您从该语句返回第一项的比较结果,而不是检查整个 arr 是否相等。
在下面的代码中,我已将 for 语句更改为在项目不匹配时返回 false。然后最后返回true,因为没有找到任何与其他arr不匹配的项目。
function whatIsInAName(collection, source) {
let keyArr = Object.keys(source);
for(let i = 0; i < keyArr.length; i++){
var arr = collection.filter(item => item.hasOwnProperty(keyArr[i]));
}
return arr.filter(item => {
for(let g = 0; g < keyArr.length; g++) {
if (item[keyArr[g]] !== source[keyArr[g]]) {
return false;
}
}
return true;
});
}
console.log(
whatIsInAName(
[{"a": 1, "b": 2, "c": 3}, {"a": 1, "b": 9999, "c": 3}],
{"a": 1, "b": 9999, "c": 3}
)
);
【解决方案2】:
第一个循环是做什么用的?在那里创建的arr 在循环的每次迭代中都会被覆盖。所以最终的arr 将是至少包含Object.keys() 中最后一个属性的项目数组。您可以直接在collections 参数上应用您的过滤器。
function whatIsInAName(collection, source) {
let keys = Object.keys(source);
return collection.filter(item => keys.every(k => item[k] === source[k]));
}
console.log(whatIsInAName([
{"a": 1, "b": 9999, "c": 3 },
{"a": 2, "b": 9999, "c": 3 },
{"a": 1, "b": 2, "c": 3 },
{"a": 1, "b": 9999, "c": 3, "d": 4 }
],
{"a": 1, "b": 9999, "c": 3}));
请记住,相等检查 === 仅适用于原始值,但不适用于对象或数组。此外,此方法将接受集合项目中不存在于源项目中的其他属性。