2014-07-10 65 views
0

假設我有:檢查在Javascript對象是否鍵和值存在

var original = { 

    0: { 
     id : 158  
    }, 
    1: { 
     id : 159  
    } 

} 

var newSeries = { 

    0: { 
     id : 158, 
     name: "Jason", 
     lastname: "Smith", 
     status : "active" 
    }, 
    1: { 
     id : 159 , 
     name: "Rebecca", 
     lastname: "Smith", 
     status : "terminated" 
    } 

} 

,我想知道例如id#158 newSeries存在original,我將如何去這樣做?我發現部分解決方案使用in運算符,但只比較它們的鍵而不是鍵和值。

+0

在你的循環,如果該鍵'in',然後檢查'newSeries [i] ['id']處的值' –

+0

考慮到你的數據當前的結構化方式,沒有其他方法可以找到id值,而不是蠻力的方式來迭代所有的鍵並檢查一個id匹配。如果需要,您可以重構數據以通過id添加索引以允許直接標識查找。 – jfriend00

+0

您可以使用數組和http://stackoverflow.com/q/16339635/218196。無論哪種方式,你遇到什麼問題?你一定嘗試過一些東西。 –

回答

0

你將不得不遍歷每個鍵和值來測試id是否存在。

例如

var myId = 158; 
for (var key in original) { 
    if (original[key].id === myId) { 
     // here your id has been found 
    } 
} 

如果你不想遍歷你的對象就是這樣,你必須改變你的數據結構的位。您可以使用ID作爲在原始對象鍵和搜索這樣的:

var original = { 

    158: { 
     id : 158  
    }, 
    159: { 
     id : 159  
    } 
}; 

var myId = 158; 

if (myId in original) { 
    // here your id has been found 
} 
+0

我發現這是最簡單的解決方案。 – Dimitri

1

如果你打算做很多這樣的處理,我會推薦使用underscorejs。它有通過傳遞LAMDA功能查找值,篩選,排序,合併,converitng和許多其他功能

隨着underscorejs其一個襯墊的方法:

_(original).find(function(x) { return x.id == 159; }) 

Jsbin demo

+0

這很有趣,雖然這不會返回一個布爾值,而是另一個匹配我們要查找的ID的對象。 – Dimitri

+0

只需加!在前面得到布爾值 –

1

試試這個:

for (var n in newSeries) { 
    console.log('id ' + 
       newSeries[n].id + 
       ' exists: ' + 
       (original[n].id === newSeries[n].id)); 
} 

FIDDLE

+0

爲什麼當它已經是一個布爾表達式時,將'original [n] .id === newSeries [n] .id'轉換爲布爾值? –

+0

@傑克好點大聲笑 – Mosho

0

如果你的目標ES5:

function isValueInObject(value, object) { 

    return Object.keys(object).map(function (key) { 
     return object[key]; 
    }).some(function (_value) { 
     return _value === value; 
    }); 

} 

console.log(isValueInObject('bar', {foo: 'bar'})) // true 
console.log(isValueInObject('baz', {foo: 'bar'})) // false 

Fiddle