這是一個名為 Wherefore art you 的 FreeCodeCamp 任務。
我必須創建一個函式來查看物件陣列(第一個引數)并回傳一個包含所有具有匹配名稱和值對(第二個引數)的物件的陣列。如果要包含在回傳的陣列中,源物件的每個名稱和值對都必須存在于集合中的物件中。
我的解決方案通過了除此之外的所有檢查:whatIsInAName([{"a": 1, "b": 2, "c": 3}], {"a": 1, "b": 9999, "c" : 3}) 應該回傳 []。我想知道為什么函式回傳給定陣列而不是空陣列。如果有辦法讓我的功能最終發揮作用。我的代碼將在下面。謝謝你的幫助!
function whatIsInAName(collection, source) {
let arr = [];
const sourceKeys = Object.keys(source);
for (let key in sourceKeys) {
arr = collection.filter(
obj => (Object.keys(obj).length >= sourceKeys.length) ?
obj.hasOwnProperty(sourceKeys[key])
&& obj[sourceKeys[key]] === source[sourceKeys[key]] : 0);
}
return arr;
}
whatIsInAName([{"a": 1, "b": 2, "c": 3}], {"a": 1, "b": 9999, "c": 3});
uj5u.com熱心網友回復:
Object.keys()您可以使用and創建一個簡單的實作Array.every()。
這意味著每個回傳的專案必須包含來自源的每個鍵和值,但可能包含額外的鍵和值:
function whatIsInAName(collection, source) {
return collection.filter(obj => Object.keys(source).every(key => obj[key] === source[key]));
}
console.log(whatIsInAName([{"a": 1, "b": 2, "c": 3}], {"a": 1, "b": 9999, "c": 3}));
console.log(whatIsInAName([{"a": 1, "b": 2, "c": 3}], {"a": 1, "b": 2, "c": 3}));
console.log(whatIsInAName([{"a": 1, "b": 2, "c": 3, "d": 4 }], {"a": 1, "b": 2, "c": 3}));
console.log(whatIsInAName([{"a": 1, "c": 3, "d": 4 }], {"a": 1, "b": 2, "c": 3}));
.as-console-wrapper { max-height: 100% !important; top: 0; }
uj5u.com熱心網友回復:
以下應該有效:
function fltArr(collection, p) {
const tst=Object.entries(p);
return [...collection].filter(o=>
tst.every(([k,v])=>o[k]==v)) // check for each key and value of p
} // that they are the same in o[k]
const arr=[{a: 1, b: 2, c:3, d:7},{a: 1, b: 2, d: 3}],
patterns=[{a: 1, b: 9999, c: 3},{a: 1, b: 2, c: 3},{a: 1, b: 2, d: 3}];
patterns.forEach(p=>console.log(fltArr(arr,p)))
據我了解這個問題,集合物件可以具有額外的屬性(未在中指定p)并且仍然是匹配的。由于這個原因,第一個元素與第二個測驗模式匹配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417726.html
標籤:
