2015-05-21 104 views
5

我需要檢查一個對象是否在邏輯上是一個數組,當兩個對象在邏輯上相等時(就像Java中的equals一樣),它將被視爲「在「陣列中如何檢查一個對象是否在邏輯上是一個數組,JavaScript

雖然我使用的jQuery來測試下面的代碼,它會回退-1,表示複製的數據不會被視爲數組中的」in「。

var a =[{value: "G27", title: "G27"}]; 
$.inArray({value: "G27", title: "G27"},a); //returns -1 

以上僅僅是一個例子,有沒有通用案件一種簡單的方法來實現這一

+2

在javascript中,沒有兩個obects永遠都是一樣的,所以它通常會很困難,您應該嘗試找出構建數據的更好方法。 – adeneo

+0

您正在創建兩個對象,但是當您這樣做時,它將起作用: 'var b = {value:「G27」,title:「G27」}; var a = [b]; $ .inArray(b,a); //返回0' –

+0

我想你可能會在這裏找到一個可能的答案:[array.contains(obj)in JavaScript] [1]! [1]:http://stackoverflow.com/questions/237104/array-containsobj-in-javascript – KevinD

回答

1

一個解決辦法是在一個檢查每個鍵 - 值對的循環:

function exist(arr, obj){ 
    var len = Object.keys(obj).length; 
    var count = 0; 
    for(var i=0;i<arr.length;i++){ 
     count=0; 
     for(var key in obj){ 
      if(obj[key] == arr[i][key]){ 
      count++; 
      } 
     } 
     if(count == len && count == Object.keys(arr[i]).length){ 
     console.log("Exists!!"); 
     return; 
     } 
    } 
    console.log("Don't exist!!"); 
} 

var arr =[{value: "G27", title: "G27"}]; 
var b = {value: "G27", title: "G27"}; 
//Call 
exist(arr, b); 
+0

這是一個非動態的解決方案,因爲它假設只用鍵/值屬性的簡單對象。所以,每次將新屬性添加到對象時,他都必須編輯此循環 – Gouda

+0

@Gouda。你是對的。編輯我的答案。 – Zee

+0

@Jaskey試試這個解決方案,應該可以工作。 – Zee

0

您可以使用數組的過濾方法。

var arr = [{value: "G27", title: "G27"}]; 
// Don't call filter on arr because this will mutate arr itself. Instead of creating a new array. 
var filteredArr = Array.prototype.filter.call(arr, function(item) { 
    return item.value == "G27" && iem.title == "G27"; 
}); 

if(filteredArr.length > 0) { 
    // Item exists 
} 
1

如果你喜歡使用underscore.js,你可以嘗試使用_.findWhere()

var a = [{value: "G27", title: "G27"}]; 
 
snippet.log(_.findWhere(a, {value: "G27", title: "G27"}) !== undefined); // returns true
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script> 
 
<script src="http://underscorejs.org/underscore-min.js"></script>

+0

嗨@Scimonster,沒有問題拒絕我的編輯..因爲我看到你做出了更好的答案,我只是喜歡你的答案,並試圖證明它是如何工作的:) – Gouda

0

您可以嘗試自定義搜索:

var indexOf = function(array, obj) { 
 
    var i = array.length; 
 
    var o; 
 
    while (o = array[--i]) //note, its assignment 
 
    if (obj.value === o.value && obj.title === o.title) 
 
     break; 
 
    return i; 
 
}; 
 

 
var arr = [{ 
 
    value: "G27", 
 
    title: "G27" 
 
}, { 
 
    value: "G28", 
 
    title: "G28" 
 
}, { 
 
    value: "G29", 
 
    title: "G29" 
 
}]; 
 

 
console.log(indexOf(arr, { 
 
    title: "G28", 
 
    value: "G28" 
 
})); //<-- 1 
 

 
console.log(indexOf(arr, { 
 
    title: "G30", 
 
    value: "G30" 
 
})); //<-- -1

+0

問題是定義的對象,例如:{{ 標題: 「G28」, 值: 「G28」 }'或'{ 標題: 「G28」, 值: 「G28」 }'比'{ 值相同: 「G28」, 標題:「 G28「 }' –

+0

@ A.Wolff,感謝您的快速審查。 – Arvind

相關問題