Encontre um valor em uma matriz de objects em Javascript

Eu sei que perguntas semelhantes foram feitas antes, mas esta é um pouco diferente. Eu tenho uma matriz de objects sem nome, que contêm uma matriz de objects nomeados, e eu preciso obter o object onde “nome” é “string 1”. Aqui está um array de exemplo.

var array = [ { name:"string 1", value:"this", other: "that" }, { name:"string 2", value:"this", other: "that" } ]; 

Atualização: Eu deveria ter dito isso antes, mas assim que eu encontrar, quero substituí-lo por um object editado.

Você pode percorrer a matriz e testar a propriedade:

 function search(nameKey, myArray){ for (var i=0; i < myArray.length; i++) { if (myArray[i].name === nameKey) { return myArray[i]; } } } var array = [ { name:"string 1", value:"this", other: "that" }, { name:"string 2", value:"this", other: "that" } ]; var resultObject = search("string 1", array); 

Encontrando o elemento da matriz:

 let arr = [ { name:"string 1", value:"this", other: "that" }, { name:"string 2", value:"this", other: "that" } ]; let obj = arr.find(o => o.name === 'string 1'); console.log(obj); 

No ES6 você pode usar Array.prototype.find(predicate, thisArg?) forma:

 array.find(x => x.name === 'string 1') 

http://exploringjs.com/es6/ch_arrays.html#_searching-for-array-elements https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find

Para então replace o object mencionado (e usar outro fill método ES6 ), você pode fazer algo como:

 let obj = array.find(x => x.name === 'string 1'); let index = array.indexOf(obj); array.fill(obj.name='some new string', index, index++); 

com underscore.js use o método findWhere:

 var array = [ { name:"string 1", value:"this", other: "that" }, { name:"string 2", value:"this", other: "that" } ]; var result = _.findWhere(array, {name: 'string 1'}); console.log(result.name); 

Veja isso no JSFIDDLE

De acordo com o ECMAScript 6, você pode usar a function findIndex .

 array[array.findIndex(x => x.name == 'string 1')] 

Use um simples for -loop:

 var result = null; for (var i = 0; i < array.length; i++) { if (array[i].name === "string 1") { result = array[i]; break; } } 

Ou se você puder, ou seja, se o seu navegador suportar, use Array.filter , que é muito mais conciso:

 var result = array.filter(function (obj) { return obj.name === "string 1"; })[0]; 

Nova resposta

Eu adicionei o prop como um parâmetro, para torná-lo mais geral e reutilizável

 /** * Represents a search trough an array. * @function search * @param {Array} array - The array you wanna search trough * @param {string} key - The key to search for * @param {string} [prop] - The property name to find it in */ function search(array, key, prop){ // Optional, but fallback to key['name'] if not selected prop = (typeof prop === 'undefined') ? 'name' : prop; for (var i=0; i < array.length; i++) { if (array[i][prop] === key) { return array[i]; } } } 

Uso:

 var array = [ { name:'string 1', value:'this', other: 'that' }, { name:'string 2', value:'this', other: 'that' } ]; search(array, 'string 1'); // or for other cases where the prop isn't 'name' // ex: prop name id search(array, 'string 1', 'id'); 

Teste de mocha:

 var assert = require('chai').assert; describe('Search', function() { var testArray = [ { name: 'string 1', value: 'this', other: 'that' }, { name: 'string 2', value: 'new', other: 'that' } ]; it('should return the object that match the search', function () { var name1 = search(testArray, 'string 1'); var name2 = search(testArray, 'string 2'); assert.equal(name1, testArray[0]); assert.equal(name2, testArray[1]); var value1 = search(testArray, 'this', 'value'); var value2 = search(testArray, 'new', 'value'); assert.equal(value1, testArray[0]); assert.equal(value2, testArray[1]); }); it('should return undefined becuase non of the objects in the array have that value', function () { var findNonExistingObj = search(testArray, 'string 3'); assert.equal(findNonExistingObj, undefined); }); it('should return undefined becuase our array of objects dont have ids', function () { var findById = search(testArray, 'string 1', 'id'); assert.equal(findById, undefined); }); }); 

Resultado dos testes:

 Search ✓ should return the object that match the search ✓ should return undefined becuase non of the objects in the array have that value ✓ should return undefined becuase our array of objects dont have ids 3 passing (12ms) 

Resposta antiga - removida devido a más práticas

Se você quer saber mais porque é uma má prática, então veja este artigo:

Por que estender objects nativos é uma prática ruim?

Versão de protótipo de fazer uma pesquisa de matriz:

 Array.prototype.search = function(key, prop){ for (var i=0; i < this.length; i++) { if (this[i][prop] === key) { return this[i]; } } } 

Uso:

 var array = [ { name:'string 1', value:'this', other: 'that' }, { name:'string 2', value:'this', other: 'that' } ]; array.search('string 1', 'name'); 

Uma linha de resposta. Você pode usar a function de filtro para obter o resultado.

 var array = [ { name:"string 1", value:"this", other: "that" }, { name:"string 2", value:"this", other: "that" } ]; console.log(array.filter(function(arr){return arr.name == 'string 1'})[0]); 
 var array = [ { name:"string 1", value:"this", other: "that" }, { name:"string 2", value:"this", other: "that" } ]; var foundValue = array.filter(obj=>obj.name==='string 1'); console.log(foundValue); 

Com um foreach:

 array.forEach((item, i) => { if (item.name === 'string 1') { return item; } }); 

Você pode fazer isso com um simples loop:

 var obj = null; for (var i = 0; i < array.length; i++) { if (array[i].name == "string 1") { obj = array[i]; break; } } 

Outra maneira (para ajudar os comentários de @NullUserException e @ Wexoni) é recuperar o índice do object na matriz e, em seguida, ir a partir daí:

 var index = array.map(function(obj){ return obj.name; }).indexOf('name-I-am-looking-for'); // Then we can access it to do whatever we want array[index] = {name: 'newName', value: 'that', other: 'rocks'}; 

Considerando que você tem o seguinte trecho:

 var array = [ { name:"string 1", value:"this", other: "that" }, { name:"string 2", value:"this", other: "that" } ]; 

Você pode usar a seguinte function para procurar itens

 const search = what => array.find(element => element.name === what); 

E você pode verificar se o item foi encontrado ou não.

 if (search("string 1")) { console.log(search.value, search.other); } else { console.log('No result found'); } 

Semelhante às respostas anteriores, usei o seguinte:

  Array.prototype.getIemtByParam = function(paramPair) { var key = Object.keys(paramPair)[0]; return this.find(function(item){return ((item[key] == paramPair[key]) ? true: false)}); } 

uso:

 myArray.getIemtByParam( {name: 'Sasha'} ); 

Se você estiver usando o jQuery, tente $ .grep ().

http://api.jquery.com/jquery.grep/

Você está procurando por pesquisa genérica (Filtro) em todo o item na lista de objects sem especificar a chave do item

Entrada

 var productList = [{category: 'Sporting Goods', price: '$49.99', stocked: true, name: 'Football'}, {category: 'Sporting Goods', price: '$9.99', stocked: true, name: 'Baseball'}, {category: 'Sporting Goods', price: '$29.99', stocked: false, name: 'Basketball'}, {category: 'Electronics', price: '$99.99', stocked: true, name: 'iPod Touch'}, {category: 'Electronics', price: '$399.99', stocked: false, name: 'iPhone 5'}, {category: 'Electronics', price: '$199.99', stocked: true, name: 'Nexus 7'}] function customFilter(objList, text){ if(undefined === text || text === '' ) return objList; return objList.filter(product => { let flag; for(let prop in product){ flag = false; flag = product[prop].toString().indexOf(text) > -1; if(flag) break; } return flag; });} 

Executar

 customFilter(productList, '$9'); 

insira a descrição da imagem aqui

Aqui está a solução para pesquisar e replace

 function searchAndUpdate(name,replace){ var obj = array.filter(function ( obj ) { return obj.name === name; })[0]; obj.name = replace; } searchAndUpdate("string 2","New String 2"); 
 function getValue(){ for(var i = 0 ; i< array.length; i++){ var obj = array[i]; var arr = array["types"]; for(var j = 0; j 

Você pode usar objects de consulta do npm. Você pode pesquisar uma matriz de objects usando filtros.

 const queryable = require('query-objects'); const users = [ { firstName: 'George', lastName: 'Eracleous', age: 28 }, { firstName: 'Erica', lastName: 'Archer', age: 50 }, { firstName: 'Leo', lastName: 'Andrews', age: 20 } ]; const filters = [ { field: 'age', value: 30, operator: 'lt' }, { field: 'firstName', value: 'Erica', operator: 'equals' } ]; // Filter all users that are less than 30 years old AND their first name is Erica const res = queryable(users).and(filters); // Filter all users that are less than 30 years old OR their first name is Erica const res = queryable(users).or(filters); 

Essa resposta é boa para texto datilografado / Angular 2, 4, 5+

Eu recebi esta resposta com a ajuda da resposta @rujmah acima. Sua resposta traz a contagem da matriz … e depois encontra o valor e o substitui por outro valor …

O que esta resposta faz é simplesmente pega o nome da matriz que pode ser definido em outra variável através de outro módulo / componente … neste caso, a matriz que eu construí tinha um nome css de datas de permanência. Então, o que isso faz é extrair esse nome e, em seguida, permite-me configurá-lo para outra variável e usá-lo assim. No meu caso, era uma class html css.

let obj = this.highlightDays.find(x => x.css); let index = this.highlightDays.indexOf(obj); console.log('here we see what hightlightdays is ', obj.css); let dayCss = obj.css;