在Javascript中查找对象数组中的值

我知道以前也有人问过类似的问题,但这个问题有点不同。我有一个未命名对象的数组,其中包含一个命名对象的数组,我需要得到其中“name”为“string 1”的对象。下面是一个示例数组。

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

更新:我应该早点说,但一旦我找到它,我想用一个编辑过的对象替换它。

1373064 次浏览

你可以用一个简单的循环来实现:

var obj = null;
for (var i = 0; i < array.length; i++) {
if (array[i].name == "string 1") {
obj = array[i];
break;
}
}
你可以循环数组并测试该属性:
function search(nameKey, myArray){
for (let i=0; i < myArray.length; i++) {
if (myArray[i].name === nameKey) {
return myArray[i];
}
}
}


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


const resultObject = search("string 1", array);
console.log(resultObject)

或者使用简单的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];

查找数组元素:

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


替换数组元素:

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


let obj = arr.find((o, i) => {
if (o.name === 'string 1') {
arr[i] = { name: 'new string', value: 'this', other: 'that' };
return true; // stop searching
}
});


console.log(arr);

下面是搜索和替换的解决方案

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<arr.length;j++ ){
if(arr[j] == "value"){
return obj;
}
}


}
}

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中可以看到

新回答

我添加了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');

摩卡测试:

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');

< / s >

与之前的答案类似,我使用了以下答案:

    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'}
);

如果使用jQuery,请尝试$.grep()。

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

另一种方法(帮助@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'};

ES6中,你可以像这样使用Array.prototype.find(predicate, thisArg?):

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

< a href = " http://exploringjs.com/es6/ch_arrays.html _searching-for-array-elements " > http://exploringjs.com/es6/ch_arrays.html _searching-for-array-elements # EYZ0 < / p >

然后替换该对象(并使用另一个很酷的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++);

你可以使用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);

您是否在对象列表中查找跨项目的通用搜索(筛选器)而不指定项目键

输入

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');

enter image description here

用foreach:

let itemYouWant = null;
array.forEach((item) => {
if (item.name === 'string 1') {
itemYouWant = item;
}
});
console.log(itemYouWant);

如果有地图就更好了:

const itemYouWant = array.map((item) => {
if (item.name === 'string 1') {
return item;
}
return null;
});
console.log(itemYouWant);

根据ECMAScript 6,您可以使用findIndex函数。

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

这个答案适用于typescript / Angular 2,4,5 +

我在上面@rujmah的回答的帮助下得到了这个答案。他的回答带来了数组计数……然后查找该值并用另一个值替换它…

这个答案所做的只是抓取可能通过另一个模块/组件在另一个变量中设置的数组名…在这种情况下,我构建的数组有一个css名称stay-dates。它所做的就是提取这个名称然后允许我将它设置为另一个变量,像这样使用它。在我的例子中,它是一个html css类。

let obj = this.highlightDays。找到(x =比;x.css); let index = this.highlightDays.indexOf(obj); Console.log('这里我们看到highlightdays是什么',obj.css);

.css

一行回答。

.

.

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

考虑到您有以下片段:

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

您可以使用以下函数来搜索项目

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

您可以检查是否找到了该项目。

const found = search("string1");
if (found) {
console.log(found.value, found.other);
} else {
console.log('No result found');
}