2014-07-10 37 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