2013-10-24 72 views
1

是否可以使用array.indexOf作爲searchElement傳遞一個對象。在我的例子中,結果是-1。是否可以使用`array.indexOf`作爲`searchElement`傳遞一個對象?

var myArray = [{id: 1, name: 'milan'}, {id: 2, name: 'rome'}]; 
    var idx = myArray.indexOf({id: 1, name: 'milan'}); 

如果不行可以採用哪種更快的替代方法?也許使用array.filter並作爲結果值返回索引?

+3

可以將indexOf與對象一起使用,但它需要是同一個對象(不是具有相同屬性/值的對象),即'myArray.indexOf(myArray [0])=== 0' – Niklas

+0

你能爲我提供一個例子嗎? – GibboK

+0

這可能有助於:http://stackoverflow.com/questions/8668174/indexof-method-in-an-object-array –

回答

1

這是不可能的,因爲對象與引用相等語義進行比較;兩個不同實例的相同對象將比較不相等。這意味着無論如何,您都需要編寫用於比較的定製邏輯。

在一般情況下,您可以通過迭代每個屬性並測試每個屬性是否存在,並且在候選數組元素上具有相同的值(很可能需要遞歸)來找到該對象。根據對象可能包含的內容,比較方法也需要識別數組。

對於極其簡單的情況,例如{id: 1},您也可以通過在輸入和每個元素上使用JSON.stringify來快速骯髒地對其進行破解並比較結果。

0

array.filter()方法不返回它只是提供索引來過濾數據的索引,但它總是返回一個數組的整個對象誰滿足.filter()

可以使用該邏輯條件

function getIndex(myArray, element) 
{ 
    for(var i=0; i<array.length; i++) { 
     if(element.id == myArray[i].id) 
      return i; 
    } 
    return -1; 
} 
1

沒有,但你可以過濾出...

var myArray = [{id: 1, name: 'milan'}, {id: 2, name: 'rome'}], 
    equals = function equals(o1, o2) { 
     return o1.id == o2.id && o1.name == o2.name; 
    }, 
    idx = {id: 1, name: 'milan'}, 
    filtered = myArray.filter(function(object, index,array1) { 
     return equals(idx, object); 
    }); 
+0

我明白你的觀點,請看看它在代碼中有一個錯誤,因爲o .id沒有定義,使用對象代替 – GibboK

+0

我修復了代碼。我傳遞了'object'來解決實例問題,但代碼中有'o' ......它現在應該可以工作了。你可以使它成爲一個命名函數,並在需要它的地方使用它或提供一個「等於(o1,o2)」。我會在幾分鐘內編輯它。 –

1

不,你不能使用indexOf爲:它採用strict equality爲C比較,因此:

console.log({id: 1, name: 'milan'} === {id: 1, name: 'milan'}); // false 

因爲它們是兩個不同的對象,它包含相同的屬性。

在不遠的未來,你將能夠使用新的ES6陣列的方法,像findfindIndex(他們在Firefox Nightly已經實施爲例):

var myArray = [{id: 1, name: 'milan'}, {id: 2, name: 'rome'}]; 
var idx = myArray.findIndex(({id}) => id === 1); // `idx` will be `0` 
var item = myArray.find(({id}) => id === 1); // `item` will contains {id: 1, name: 'milan'} 

在此同時,你有手動做到這一點;如果你想比較所有的屬性更好,如果你創建一個deepEqual函數或類似的。

相關問題