假设我有一个包含四个对象的数组:
var jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
有没有一种方式可以通过属性 b
的值来获取第三个对象 ({a: 5, b: 6}
),例如不使用 for...in
循环?
假设我有一个包含四个对象的数组:
var jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
有没有一种方式可以通过属性 b
的值来获取第三个对象 ({a: 5, b: 6}
),例如不使用 for...in
循环?
筛选
对象数组中属性匹配值的元素,返回一个新的数组:
var result = jsObjects.filter(obj => {
return obj.b === 6
})
请查看MDN文档中有关Array.prototype.filter()的内容
const jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
]
let result = jsObjects.filter(obj => {
return obj.b === 6
})
console.log(result)
查找数组中第一个元素/对象的值,否则返回 undefined
。
var result = jsObjects.find(obj => {
return obj.b === 6
})
请查看MDN文档中有关Array.prototype.find()的内容
const jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
]
let result = jsObjects.find(obj => {
return obj.b === 6
})
console.log(result)
result[0]
将是第一个(唯一的)对象。 - elclanrsfind()
和箭头函数这样的方法不被所有浏览器支持”。 - Michał Perłakowskifilter()
会返回一个对象的副本,而不是原始对象,因此对其进行更改不会反映在原始数组中。 - ahaurat我不知道你为什么反对for循环(我想你指的是for loop
,而不是特定的for..in
),它们快速且容易阅读。无论如何,这里有几个选项。
For循环:
function getByValue(arr, value) {
for (var i=0, iLen=arr.length; i<iLen; i++) {
if (arr[i].b == value) return arr[i];
}
}
.筛选器
function getByValue2(arr, value) {
var result = arr.filter(function(o){return o.b == value;} );
return result? result[0] : null; // or undefined
}
.forEach
function getByValue3(arr, value) {
var result = [];
arr.forEach(function(o){if (o.b == value) result.push(o);} );
return result? result[0] : null; // or undefined
}
如果你确实想要使用 for..in 并且想要查找任何属性值为 6 的对象,那么除非传递要检查的名称,否则必须使用 for..in。
示例function getByValue4(arr, value) {
var o;
for (var i=0, iLen=arr.length; i<iLen; i++) {
o = arr[i];
for (var p in o) {
if (o.hasOwnProperty(p) && o[p] == value) {
return o;
}
}
}
}
for(let value of arr)
- pungggiarr.length
存储在 iLen
而不是直接在 for 循环条件中使用 i<arr.length
,是否有特定的原因? - Vikas Prasad实现要求的方法:
const jsObject = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
const filteredResult = jsObject.find((e) => e.b == 6);
console.log(filteredResult);
const jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
const filterObj = jsObjects.filter((e) => e.b == 6);
console.log(filterObj[0]);
const jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
for (const i in jsObjects) {
if (jsObjects[i].b == 6) {
console.log(jsObjects[i]);
}
}
好的,有几种方法可以做到这一点,但让我们从最简单和最新的方法开始,这个函数被称为find()
。
只要在使用find
时小心,因为即使IE11也不支持它,所以它需要被转译...
所以你有了如你所说的这个对象:
var jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
你可以编写一个函数并像这样获取它:
function filterValue(obj, key, value) {
return obj.find(function(v){ return v[key] === value});
}
并像这样使用函数:
filterValue(jsObjects, "b", 6); //{a: 5, b: 6}
在ES6中还有更短的版本:
const filterValue = (obj, key, value)=> obj.find(v => v[key] === value);
这个方法仅返回第一个匹配的值,如果想获得更好的结果和浏览器支持,可以使用 filter
:
const filterValue = (obj, key, value)=> obj.filter(v => v[key] === value);
我们将会返回[{a: 5, b: 6}]
的数组...
这个方法将会返回一个数组...
你同样可以使用for循环,创建如下函数:
function filteredArray(arr, key, value) {
const newArray = [];
for(i=0, l=arr.length; i<l; i++) {
if(arr[i][key] === value) {
newArray.push(arr[i]);
}
}
return newArray;
}
然后像这样调用它:
filteredArray(jsObjects, "b", 6); //[{a: 5, b: 6}]
请参阅文档 Array.prototype.find()
示例:
var inventory = [
{name: 'apples', quantity: 2},
{name: 'bananas', quantity: 0},
{name: 'cherries', quantity: 5}
];
function findCherries(fruit) {
return fruit.name === 'cherries';
}
console.log(inventory.find(findCherries));
// { name: 'cherries', quantity: 5 }
undefined?
- Oliver Dixon使用underscore.js:
var foundObject = _.findWhere(jsObjects, {b: 6});
_.find
代替:https://dev59.com/YWYr5IYBdhLWcg3wFGZS#40958199 - genericUser看起来在ECMAScript 6提案中有Array
方法find()
和findIndex()
。MDN还提供了填充物(polyfills),您可以包含它们以在所有浏览器中获得这些功能。
function isPrime(element, index, array) {
var start = 2;
while (start <= Math.sqrt(element)) {
if (element % start++ < 1) return false;
}
return (element > 1);
}
console.log( [4, 6, 8, 12].find(isPrime) ); // undefined, not found
console.log( [4, 5, 8, 12].find(isPrime) ); // 5
function isPrime(element, index, array) {
var start = 2;
while (start <= Math.sqrt(element)) {
if (element % start++ < 1) return false;
}
return (element > 1);
}
console.log( [4, 6, 8, 12].findIndex(isPrime) ); // -1, not found
console.log( [4, 6, 7, 12].findIndex(isPrime) ); // 2
如果你想要一个单一的结果而不是一个数组,我建议使用reduce方法。
以下是使用普通的JavaScript编写的解决方案,如果存在匹配的对象,则返回该对象;否则返回null。
var result = arr.reduce(function(prev, curr) { return (curr.b === 6) ? curr : prev; }, null);
如果我理解正确,你想要在数组中找到其 b
属性为 6
的对象?
var found;
jsObjects.some(function (obj) {
if (obj.b === 6) {
found = obj;
return true;
}
});
或者,如果您使用下划线:
var found = _.select(jsObjects, function (obj) {
return obj.b === 6;
});
some
只返回true或false,不会返回匹配的对象。 - RobG.some()
的作用是确定数组中是否有元素通过测试。在这种情况下,最好使用 .forEach()
,因为您已经决定将结果分配给一个变量。 - Michał Perłakowski.some
中的 return true
实际上就像是 for 循环中的 break
。 - nickf
b = 6
- Madbreaks