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?

Brown KL
fonte
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

Matt Pileggi
fonte
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";
});
tymeJV
fonte
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');
}

jcubic
fonte
24

Use um for...inloop:

for (let k in obj) {
    if (obj[k] === "test1") {
        return true;
    }
}
isvforall
fonte
@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");
galinhas
fonte
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

Rato perigoso
fonte
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
DarckBlezzer
fonte
6

Para um one-liner, eu diria:

exist = Object.values(obj).includes("test1");
console.log(exist);
Joshua Shibu
fonte
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"); }));
Yokki vallayok
fonte
0

você pode tentar este

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

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

findSpecificStr(obj, 'test1');
fengxh
fonte
-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");
Devang Hire
fonte
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.

Chukwuemeka aigbokhan
fonte
-3
if( myObj.hasOwnProperty('key') && myObj['key'] === value ){
    ...
}
Noctisdark
fonte
-4

A resposta simples para isso é dada abaixo.

Isso está funcionando porque todo tipo de JavaScript tem uma propriedade “construtor” em seu protótipo ”.

Insira a descrição da imagem aqui

Insira a descrição da imagem aqui

Mohd Sahil
fonte
4
Adicione seu código à sua resposta como um texto e não uma imagem. Consulte também Como formatar minhas postagens usando Markdown ou HTML?
Vasil Velichkov
Transcreva o código da imagem em texto. Desde já, obrigado.
Peter Mortensen
-7

Esta deve ser uma verificação simples.

Exemplo 1

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

if(myObj.a == "test1") {
    alert("test1 exists!");
}
KpTheConstructor
fonte
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