如何使用javascript检查对象中是否存在值

Bro*_* KL 73 javascript

我在javascript中有一个对象

var obj = {
   "a": "test1",
   "b": "test2"
}
Run Code Online (Sandbox Code Playgroud)

如何检查对象中是否存在test1作为值?

Mat*_*ggi 94

您可以将Object的值转换为数组并测试字符串是否存在.它假定Object没有嵌套,并且字符串是完全匹配的:

var obj = { a: 'test1', b: 'test2' };
if (Object.values(obj).indexOf('test1') > -1) {
   console.log('has test1');
}
Run Code Online (Sandbox Code Playgroud)

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/values

  • 略微冗长:`if(Object.values(obj).includes('test1')){...}` (17认同)
  • 这是Ecma2017的一部分,它还没有用于大多数用途:( (8认同)
  • IE 11 和 Edge 不支持,最好使用 for..in 循环,如下所述 (2认同)
  • 说实话,我更喜欢 @nickb 版本,也许可以考虑更新? (2认同)

chi*_*ens 37

最短的 ES6+ 单线:

let exists = Object.values(obj).includes("test1");
Run Code Online (Sandbox Code Playgroud)

  • 请注意,IE 不支持 .includes(),因此仅在 Node 的服务器端使用它,或者如果您根本不关心 IE。 (2认同)

tym*_*eJV 30

您可以使用Array方法.some:

var exists = Object.keys(obj).some(function(k) {
    return obj[k] === "test1";
});
Run Code Online (Sandbox Code Playgroud)


jcu*_*bic 26

尝试:

var obj = {
   "a": "test1",
   "b": "test2"
};
Object.keys(obj).forEach(function(key) {
  if (obj[key] == 'test1') {
    alert('exists');
  }
});
Run Code Online (Sandbox Code Playgroud)

要么

var obj = {
   "a": "test1",
   "b": "test2"
};
var found = Object.keys(obj).filter(function(key) {
  return obj[key] === 'test1';
});
if (found.length) {
   alert('exists');
}
Run Code Online (Sandbox Code Playgroud)

UPDATE这不会对工作NaN-0对这些值,你可以使用(而不是===在ES6)新:

 Object.is(obj[key], value);
Run Code Online (Sandbox Code Playgroud)


isv*_*all 16

使用for...in循环:

for (let k in obj) {
    if (obj[k] === "test1") {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 被严重低估的答案,这个方法的表现比任何其他方法都要好 (4认同)

小智 14

您可以使用Object.values()

Object.values()方法以for...in循环提供的顺序返回给定对象自己的可枚举属性值的数组 (区别是for-in循环也枚举原型链中的属性)。

然后使用indexOf()方法:

indexOf()方法返回可以在数组中找到给定元素的第一个索引;如果不存在,则返回-1。

例如:

Object.values(obj).indexOf("test`") >= 0
Run Code Online (Sandbox Code Playgroud)

下面是一个更详细的示例:

Object.values(obj).indexOf("test`") >= 0
Run Code Online (Sandbox Code Playgroud)


小智 13

对于单线,我会说:

exist = Object.values(obj).includes("test1");
console.log(exist);
Run Code Online (Sandbox Code Playgroud)


Dar*_*zer 5

我对所有示例进行了测试,并在nodejs v8.11.2进行了测试,以此为指南选择最佳选择。

let i,tt;
	const obj = { a: 'test1', b: 'test2' , c: 'test3' , d: 'test4' , e: 'test5' , f: 'test6' };
	
console.time("test1")
i=0;
for(;i<1000000;i=i+1){
  if (Object.values(obj).indexOf('test4') > -1) {
    tt = true;
  }
}
console.timeEnd("test1")

console.time("test1.1")
i=0;
for(;i<1000000;i=i+1){
  if (~Object.values(obj).indexOf('test4')) {
    tt = true;
  }
}
console.timeEnd("test1.1")

console.time("test2")
i=0;
for(;i<1000000;i=i+1){
  if (Object.values(obj).includes('test4')) {
    tt = true;
  }
}
console.timeEnd("test2")


console.time("test3")
i=0;
for(;i<1000000;i=i+1){
  for(const item in obj){
    if(obj[item] == 'test4'){
      tt = true;
      break;
    }
  }
}
console.timeEnd("test3")

console.time("test3.1")
i=0;
for(;i<1000000;i=i+1){
  for(const [item,value] in obj){
    if(value == 'test4'){
      tt = true;
      break;
    }
  }
}
console.timeEnd("test3.1")


console.time("test4")
i=0;
for(;i<1000000;i=i+1){
  tt = Object.values(obj).some( (val,val2) => {
    return val == "test4" 
  }); 
}
console.timeEnd("test4")

console.time("test5")
i=0;
for(;i<1000000;i=i+1){
  const arr = Object.keys(obj);
  const len = arr.length;
  let i2=0;
  for(;i2<len;i2=i2+1){
    if(obj[arr[i2]]=="test4"){
      tt = true;
      break;
    }
  }
}
console.timeEnd("test5")
Run Code Online (Sandbox Code Playgroud)

在我的服务器上输出

test1: 272.325ms
test1.1: 246.316ms
test2: 251.980ms
test3: 73.284ms
test3.1: 102.029ms
test4: 339.299ms
test5: 85.527ms
Run Code Online (Sandbox Code Playgroud)


小智 5

你可以试试这个

var obj = {
  "a": "test1",
  "b": "test2"
};

const findSpecificStr = (obj, str) => {
  return Object.values(obj).includes(str);
}

findSpecificStr(obj, 'test1');
Run Code Online (Sandbox Code Playgroud)