2017-03-06 81 views
0

我是一名開發人員,對JavaScript速記方法知之甚少。用於檢查對象數組中的特定鍵值的JavaScript快捷方式

我遇到了一種情況,我需要在JavaScript中循環使用for循環。

假設我有對象的像

var arr = [{name:'abc', val:1}, {name:'xyz', val:2}, ....]; 

給出一個字符串「XYZ」的陣列,是否有任何的JavaScript /角的簡寫,而無需使用for循環,如果我的對象數組持有的名稱返回true 'xyz'的價值。

我正在尋找速記表達式,類似indexOf函數。

任何幫助,非常感謝。

+3

'arr.some(O => 0 .name ===「xyz」)' – Andreas

+0

非常感謝你 – shreyansh

+0

你也可以使用 [查找功能](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/找到) –

回答

1

可以在預ES6使用

if (arr.filter(function(x) { return x.name === 'xyz'; }).length > 0) { ... } 

這是一個比較繁瑣的版本,當然你可以提取你的函數有一個更可讀/柔性版這樣:

function equaling(attr, value) { 
    return function(obj) { 
    return (obj || {})[attr] === value; 
    }; 
} 

if (arr.filter(equaling('name', 'xyz')).length > 0) { ... } 

你也可以使用

if (arr.some(({ name }) => name === 'xyz')) { ... } 

與ES6/ES2015。這基本上利用了最新的語言功能,並且可讀,可表達和可維護,而無需創建自己的功能。

提到的特點是:

  • (value) => expression:這是一個箭頭函數(簡寫)定義函數文本的等效,其結果是靠近在ES5函數定義(function(value) { return expression; }) - 的區別在於函數變體中的箭頭函數變體中的this不同於this
  • ({ name }) => ...:這是一個對象擴展表達式,它允許您根據屬性名稱輕鬆地將任何對象解構成其組件(或其組成部分)。
+0

非常感謝,很好的回答和ve很好解釋。 – shreyansh

+0

我會避免使用過濾器,因爲它會要求您檢查整個陣列,以確保您每次最差情況下的性能(感興趣的項目在數組的末尾) – mccainz

1

沒有快速的簡寫,最短的,我認爲最快的解決辦法是使用Array.some

var hasName = arr.some(o => o.name === "xyz") 

這會遇到一個匹配的元素,一旦中斷,會給你要麼truefalse

+0

非常感謝你 – shreyansh

+0

完美的用例爲某些功能。方法簡潔,閱讀順利,不需要任何東西。 – mccainz

1

您可以使用angular forEach函數循環搜索它。

var matchingIndex = -1; 
angular.forEach($scope.data, function(item, itemIndex) { 
    if(item.name === "xyz"){ 
     matchingIndex = itemIndex; 
    } 
}); 
console.log(matchingIndex); 
+0

它與for循環相同,它不是簡寫,只是它是異步循環。 – shreyansh

+0

一旦找到匹配,你應該「打破」循環。在那種情況下,它至少在功能上等同於「some」數組函數。這說明了只有在無法訪問「某些」數組函數的情況下才能使用此方法。 – mccainz

0

如果你不能使用數組「一些」功能,那麼你應該簡單地構建一個基本的for循環和測試在其中。

避免使用諸如「forEach」或「filter」之類的數組函數,因爲它們將要求您檢查整個數組,因此每次都能保證最差情況下的性能,即使感興趣的項目位於數組的開頭。爲「過濾器」短路「forEach」將需要你做一些醜陋的事情,例如在try-catch塊中包裝函數調用,然後在找到匹配時拋出(不這樣做)。

所以,如果你不能使用「some」功能,那麼接受一個基本的for循環,並儘快找到一個匹配。

0

另一種解決方案是使用array.findIndex。您可以創建功能檢查與指定名稱的元素的存在:

const findByName = (name) => arr.findIndex(elem => elem.name === 'xyz') > -1; 

,然後使用它:

findByName('xyz') // true 
findByName('wrongName') // false 

一下:https://jsfiddle.net/63ayto1w/1/

相關問題