Найти значение в массиве объектов в Javascript
Я знаю, что подобные вопросы задавались раньше, но это немного другое. У меня есть массив неназванных объектов, которые содержат массив именованных объектов, и мне нужно получить объект, где "имя" - это "строка 1". Вот пример массива.
var array = [
{ name:"string 1", value:"this", other: "that" },
{ name:"string 2", value:"this", other: "that" }
];
Обновление: Я бы сказал об этом раньше, но как только я его найду, я хочу заменить его отредактированным объектом.
Ответы
Ответ 1
Вы можете выполнить цикл над массивом и проверить его свойство:
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);
Ответ 2
Поиск элемента массива:
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);
Ответ 3
В ES6 вы можете использовать Array.prototype.find(predicate, thisArg?)
следующим образом:
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
Чтобы заменить этот объект (и использовать другой классный ES6 метод fill
), вы можете сделать что-то вроде:
let obj = array.find(x => x.name === 'string 1');
let index = array.indexOf(obj);
array.fill(obj.name='some new string', index, index++);
Ответ 4
с помощью underscore.js
используйте метод 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);
Смотрите это в JSFIDDLE
Ответ 5
В соответствии с ECMAScript 6 вы можете использовать функцию findIndex
.
array[array.findIndex(x => x.name == 'string 1')]
Ответ 6
Используйте простой for
-loop:
var result = null;
for (var i = 0; i < array.length; i++) {
if (array[i].name === "string 1") {
result = array[i];
break;
}
}
Или, если вы можете, то есть, если ваш браузер поддерживает его, используйте Array.filter
, что намного более сложно:
var result = array.filter(function (obj) {
return obj.name === "string 1";
})[0];
Ответ 7
Новый ответ
Я добавил параметр prop в качестве параметра, чтобы сделать его более общим и многоразовым
/**
* 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];
}
}
}
Использование:
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');
Тест 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);
});
});
результаты теста:
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)
Старый ответ - удален из-за неправильной практики
если вы хотите узнать больше, почему это плохая практика, посмотрите эту статью:
Почему распространение родных объектов на плохую практику?
Прототипная версия выполнения поиска массива:
Array.prototype.search = function(key, prop){
for (var i=0; i < this.length; i++) {
if (this[i][prop] === key) {
return this[i];
}
}
}
Использование:
var array = [
{ name:'string 1', value:'this', other: 'that' },
{ name:'string 2', value:'this', other: 'that' }
];
array.search('string 1', 'name');
Ответ 8
Другой способ (чтобы помочь @NullUserException и комментарии @Wexoni) - получить индекс объекта в массиве, а затем перейти оттуда:
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'};
Ответ 9
С помощью foreach:
array.forEach((item, i) => {
if (item.name === 'string 1') {
return item;
}
});
Ответ 10
Вы можете сделать это с помощью простого цикла:
var obj = null;
for (var i = 0; i < array.length; i++) {
if (array[i].name == "string 1") {
obj = array[i];
break;
}
}
Ответ 11
Как и в предыдущих ответах, я использовал следующее:
Array.prototype.getIemtByParam = function(paramPair) {
var key = Object.keys(paramPair)[0];
return this.find(function(item){return ((item[key] == paramPair[key]) ? true: false)});
}
использование:
myArray.getIemtByParam(
{name: 'Sasha'}
);
Ответ 12
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);
Ответ 13
если вы используете jQuery try $.grep().
http://api.jquery.com/jquery.grep/
Ответ 14
Вы ищете общий поиск (фильтр) по элементу в списке объектов без указания клавиши элемента
Ввод
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;
});}
Выполнить
customFilter(productList, '$9');
![введите описание изображения здесь]()
Ответ 15
Один ответ строки.
Вы можете использовать функцию фильтра для получения результата.
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]);
Ответ 16
Вот решение для поиска и замены
function searchAndUpdate(name,replace){
var obj = array.filter(function ( obj ) {
return obj.name === name;
})[0];
obj.name = replace;
}
searchAndUpdate("string 2","New String 2");
Ответ 17
function getValue(){
for(var i = 0 ; i< array.length; i++){
var obj = array[i];
var arr = array["types"];
for(var j = 0; j<arr.length;j++ ){
if(arr[j] == "value"){
return obj;
}
}
}
}
Ответ 18
Вы можете использовать query-objects из npm. Вы можете искать массив объектов с помощью фильтров.
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);
Ответ 19
Этот ответ хорош для typescript/Angular 2, 4, 5+
Я получил этот ответ с помощью ответа @rujmah выше. Его ответ приводит к количеству массивов... и затем находит значение и заменяет его другим значением...
Что этот ответ делает, просто хватает имя массива, которое может быть установлено в другой переменной через другой модуль/компонент... в этом случае массив, который я построил, имел имя css для дат пребывания. Итак, что это делает, это извлечение этого имени, а затем позволяет мне установить его в другую переменную и использовать его так. В моем случае это был класс 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;