目标是构建一个函数,该函数将对象数组作为第一个参数。作为第二个参数,它需要一个键和值对。
function whatIsInAName(collection, source)
现在该函数应该返回一个数组,其中包含对象中所有匹配的键和值。例如:
whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" })´
应该返回
[{ first: "Tybalt", last: "Capulet" }]
还有
whatIsInAName([{ "apple": 1, "bat": 2 }, { "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }], { "apple": 1, "bat": 2 })
应该返回
[{ "apple": 1, "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }]
我尝试循环遍历集合并通过源数组搜索匹配项。像这样:
function whatIsInAName(collection, source) {
// What's in a name?
var arr = [];
for (var i = 0; i < Object.keys(collection).length; i++) {
for (var j = 0; j < Object.keys(source).length; j++) {
if (collection[i].last === source.last) {
arr.push(collection[i]);
}
}
}
console.log(arr);
}
在这种情况下 whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" })
这并不奇怪。
我不明白的是,为什么我不能概括上述解决方案,以便它也适用于其他情况。
为什么不能简单地给出条件:
if (collection[i] === source)
(请注意集合和源后面缺少的“Last"
键。)
当我 console.log(source)
,控制台记录它。所以恕我直言,上面的条件语句应该有效,并且应该将匹配项插入 arr
大批。
如何构建一个函数,该函数返回一个数组,其中包含对象中所有匹配的键和值。
function whatIsInAName(collection, source)
为什么(collection[i] === source
)不工作?
谢谢。
最佳答案
您需要迭代键/值对并返回过滤后的结果。
实际上没有内置方法可以将一个对象与另一个对象进行测试来检查该对象是否包含子对象。
function whatIsInAName(collection, source) {
var pairs = Object.entries(source);
return collection.filter(object => pairs.every(([key, value]) => object[key] === value));
}
console.log(whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" }));
console.log(whatIsInAName([{ "apple": 1, "bat": 2 }, { "bat": 2 }, { "apple": 1, "bat": 2, "cookie": 2 }], { "apple": 1, "bat": 2 }));
.as-console-wrapper { max-height: 100% !important; top: 0; }
关于javascript - 与参数匹配时返回对象的键和值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54558758/