Como verificar se existe um valor em um objeto usando JavaScript


103

Tenho um objeto em JavaScript:

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

Como posso verificar se test1 existe no objeto como um valor?


16
Uau ... aqueles que marcaram como duplicado são malucos ou não sabem ler em inglês. De qualquer forma, com es7, você faz algo como:Object.values(obj).includes('test1');
Mali Naeemi

2
Aqui está o não duplicado (verifique a chave) referido a: stackoverflow.com/questions/1098040/…
Samuel Åslund

Respostas:


126

Você pode transformar os valores de um objeto em uma matriz e testar se uma string está presente. Ele assume que o objeto não está aninhado e a string é uma correspondência exata:

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

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


8
Isso faz parte do Ecma2017, ainda não está disponível para a maioria dos usos :(
Ran Halprin

2
Não suportado no IE 11 e no Edge, é melhor usar o loop for..in conforme descrito abaixo
eugenesqr

24
Um pouco menos prolixo: if(Object.values(obj).includes('test1')) { ... }
nickb

41

Você pode usar o método Array .some:

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

36

Experimentar:

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

Object.keys(obj).forEach(function(key) {
  if (obj[key] == 'test1') {
    alert('exists');
  }
});

Ou

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

var found = Object.keys(obj).filter(function(key) {
  return obj[key] === 'test1';
});

if (found.length) {
   alert('exists');
}

Isso não funcionará para NaNe -0para esses valores. Você pode usar (em vez de ===) o que há de novo no ECMAScript 6:

 Object.is(obj[key], value);

Com navegadores modernos, você também pode usar:

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

if (Object.values(obj).includes('test1')) {
  alert('exists');
}


24

Use um for...inloop:

for (let k in obj) {
    if (obj[k] === "test1") {
        return true;
    }
}

@Gregor, não importa, pois 'k' é definido novamente quando assume o próximo valor.
Vikrant

4
resposta altamente subestimada, o desempenho deste é melhor do que qualquer outro método
PirateApp

2
Concordo com aquilo. resposta muito subestimada ...
Samakaab

22

ES6 mais curto + um forro:

let exists = Object.values(obj).includes("test1");

1
Lembre-se de que o IE não suporta .includes (), então use-o apenas no lado do servidor com o Node ou se você simplesmente não se importa com o IE.
João Pimentel Ferreira

19

Você pode usar Object.values ​​() :

O Object.values()método retorna uma matriz de valores de propriedade enumeráveis ​​do próprio objeto, na mesma ordem fornecida por um for...inloop (a diferença é que um loop for-in enumera propriedades na cadeia de protótipo também).

e use o método indexOf () :

O indexOf()método retorna o primeiro índice no qual um determinado elemento pode ser encontrado na matriz, ou -1 se não estiver presente.

Por exemplo:

Object.values(obj).indexOf("test`") >= 0

Um exemplo mais detalhado está abaixo:

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


console.log(Object.values(obj).indexOf("test1")); // 0
console.log(Object.values(obj).indexOf("test2")); // 1

console.log(Object.values(obj).indexOf("test1") >= 0); // true
console.log(Object.values(obj).indexOf("test2") >= 0); // true 

console.log(Object.values(obj).indexOf("test10")); // -1
console.log(Object.values(obj).indexOf("test10") >= 0); // false


8

Fiz um teste com todos esses exemplos e o executei no Node.js v8.11.2 . Tome isso como um guia para selecionar sua melhor escolha.

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")

Saída em meu servidor

test1:   272.325 ms
test1.1: 246.316 ms
test2:   251.98 0ms
test3:    73.284 ms
test3.1: 102.029 ms
test4:   339.299 ms
test5:    85.527 ms

6

Para um one-liner, eu diria:

exist = Object.values(obj).includes("test1");
console.log(exist);

2

Você pode tentar isto:

function checkIfExistingValue(obj, key, value) {
    return obj.hasOwnProperty(key) && obj[key] === value;
}
var test = [{name : "jack", sex: F}, {name: "joe", sex: M}]
console.log(test.some(function(person) { return checkIfExistingValue(person, "name", "jack"); }));

0

você pode tentar este

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

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

findSpecificStr(obj, 'test1');

-1
getValue = function (object, key) {
    return key.split(".").reduce(function (obj, val) {
        return (typeof obj == "undefined" || obj === null || obj === "") ? obj : (_.isString(obj[val]) ? obj[val].trim() : obj[val]);}, object);
};

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

Função chamada:

 getValue(obj, "a");

Você usou outras bibliotecas ao implementar esta solução?
Sherwin Ablaña Dapito

-2
var obj = {"a": "test1", "b": "test2"};
var getValuesOfObject = Object.values(obj)
for(index = 0; index < getValuesOfObject.length; index++){
    return Boolean(getValuesOfObject[index] === "test1")
}

O método Object.values ​​() retornou um array (atribuído a getValuesOfObject) contendo os valores de propriedade enumeráveis ​​do próprio objeto (obj). A matriz foi iterada usando o forloop para recuperar cada valor (valores em getValuesfromObject) e retorna uma função Boolean () para descobrir se a expressão ("text1" é um valor na matriz em loop) é verdadeira.


-3
if( myObj.hasOwnProperty('key') && myObj['key'] === value ){
    ...
}


-7

Esta deve ser uma verificação simples.

Exemplo 1

var myObj = {"a": "test1"}

if(myObj.a == "test1") {
    alert("test1 exists!");
}

1
Isso verifica a chave, não o valor.
jcubic

1
A coisa vai atravessar a cadeia de protótipo e provavelmente funcionará como esperado!, Por exemplo var a = {};<br/>'hasOwnProperty' in a' //true
Noctisdark
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.