[英]Return Element Array from an object key
給定一個對象和一個鍵,我創建了一個函數,該函數返回一個數組,該數組包含位於給定鍵處等於10的數組的所有元素。
如果數組為空,則應返回一個空數組,如果該數組不包含等於10的元素,則應返回一個空數組,並且如果給定鍵處的屬性不是數組,則應返回一個空數組。
function getElementsThatEqual10AtProperty(obj, key) {
for(var prop in obj){
if(obj[prop] === 10){
return obj[key];
}
}
}
var obj = {
key: [1000, 10, 50, 10]
};
var output = getElementsThatEqual10AtProperty(obj, 'key');
console.log(output); // --> IT MUST RETURN [10, 10]
知道我在做什么錯嗎?
在代碼中,您正在遍歷對象中的所有屬性。
for(var prop in obj)
因此,道具將在第一次迭代中位於您的“鍵”中。 然后您問obj['key'] === 10
。
這不是您要進行的檢查,因為這基本上是[1000, 10, 50, 10] === 10
然后,您可以過濾數組,查找與您的條件匹配的所有項目,即是否等於10?
return obj['key'].filter(function(item) {
return item === 10;
});
當您將其傳遞到函數中時,就可以進一步了解它所要查找的Key,這樣就不必遍歷Object,可以直接進行查找:
obj[key]
但是,正如您所說,如果不匹配,您想返回一個空數組,因此可以使用:
var array = (obj[key] || [])
這基本上意味着,如果obj [key]不存在,則只需使用[]
。
結合整個過程看起來像:
function foobar(object, key) { return (object[key] || []).filter(function(item) { return item === 10; }); } var object = { unique: [1, 10, 100, 10], nothing: [1,2,3,4,5] } console.log(foobar(object, 'unique')); // returns [10, 10] console.log(foobar(object, 'asgasgag')); // returns [] console.log(foobar(object, 'nothing')); // returns []
obj['key']
是一個數組...所以它永遠不能等於10
。 您還需要過濾該數組。
可以為此使用Array#filter()
function getElementsThatEqual10AtProperty(obj, key) { var arr = obj[key] || []; return arr.filter(function(val){ return val === 10; }); } var obj = { key: [1000, 10, 50, 10] }; var output = getElementsThatEqual10AtProperty(obj, 'key'); console.log(output); // --> IT MUST RETURN [10, 10]
如果我理解正確,則要檢查obj
的屬性key
是否為數組,如果是,則返回等於10的所有元素。
由於您已經有了屬性的名稱,因此無需進行迭代。 只需直接訪問key
屬性,然后檢查它是否為Array
類型。 然后,您需要過濾數組。
這是代碼示例(不是最好的代碼,而是用於學習):
function getElementsThatEqual10AtProperty(obj, key) {
if(obj[key] instanceof Array){
// the key property is an array
return obj[key].filter(function(v){ return v == 10;})
}
// not an array
return [];
}
這可以通過使用filter
來實現。
filter()方法創建一個新數組,其中所有元素都通過了由提供的函數實現的測試。
我在下面的解決方案中使用了ES6
箭頭語法,以便更加簡潔。 您也可以直接在數組上調用.filter()
並顯式提供謂詞(item === 10),而不是創建要動態提供的謂詞。
const myArr = [10,100,10,1];
const filterBy = (arr, key) => arr.filter(item => item === key);
filterBy(myArr, 10); // returns [10, 10]
注意:如果不滿足提供給過濾器的謂詞(在這種情況下,找不到值10),則將返回一個空數組。
也許這樣的事情會幫助您朝正確的方向發展?
function getElementsThatEqual10AtProperty(obj) { var response = []; for (var i = 0; i < obj.key.length; i++) { if (obj.key[i] === 10) { response.push(obj.key[i]); } } return response; } var obj = { key: [1000, 10, 50, 10] }; var output = getElementsThatEqual10AtProperty(obj); console.log(output);
對於您的情況,可以使用Array的reduce方法。 在函數內部:
return obj[key].reduce(function (result, value) {
if (value === 10) result.push(value)
}, []);
MSDN參考: .reduce()
有更短的方法。 一個可以使用.map和.filter的代碼,請參見下文。
var obj = {
key: [1000, 10, 50, 10]
};
//To get the key
var output = obj.key.map((obj,i) => obj === 10 ? obj : '').filter(String);
//To get the index
var index = obj.key.map((obj,i) => obj === 10 ? i : '').filter(String);
//log output || index
console.log(output);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.