簡體   English   中英

從對象鍵返回元素數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM