假设我有一个包含四个对象的数组:
var jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
有没有办法可以通过属性{a: 5, b: 6}
的值获取第三个对象(b
),例如没有for...in
循环?
答案 0 :(得分:879)
Filter
对象数组,其属性与value匹配,返回数组:
var result = jsObjects.filter(obj => {
return obj.b === 6
})
请参阅MDN Docs on 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)
Find
数组中第一个元素/对象的值,否则返回undefined
。
var result = jsObjects.find(obj => {
return obj.b === 6
})
请参阅MDN Docs on 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)
答案 1 :(得分:240)
jsObjects.find(x => x.b === 6)
来自MDN:
如果数组中的元素满足提供的测试函数,则
find()
方法返回数组中的值。否则返回undefined
。
附注:旧版浏览器(如IE)不支持find()
和箭头功能等方法,因此如果您想支持这些浏览器,则应使用Babel来转换代码。
答案 2 :(得分:137)
我不知道为什么你反对for循环(大概是你的意思是for循环,而不是专门用于..in),它们快速且易于阅读。无论如何,这里有一些选择。
For loop:
function getByValue(arr, value) {
for (var i=0, iLen=arr.length; i<iLen; i++) {
if (arr[i].b == value) return arr[i];
}
}
.filter
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
}
另一方面,如果您确实想要...并且想要找到具有值为6的任何属性的对象,则必须使用for..in,除非您传递名称以进行检查。 e.g。
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;
}
}
}
}
答案 3 :(得分:32)
尝试Array filter方法,使用array of objects
过滤property
。
var jsObjects = [
{a: 1, b: 2},
{a: 3, b: 4},
{a: 5, b: 6},
{a: 7, b: 8}
];
使用数组过滤方法:
var filterObj = jsObjects.filter(function(e) {
return e.b == 6;
});
使用in循环:
for (var i in jsObjects) {
if (jsObjects[i].b == 6) {
console.log(jsObjects[i]); // {a: 5, b: 6}
}
}
答案 4 :(得分:19)
使用underscore.js:
var foundObject = _.findWhere(jsObjects, {b: 6});
答案 5 :(得分:17)
在ECMAScript 6提案中,有Array
种方法find()
和findIndex()
。 MDN还提供了polyfill,您可以包含这些polyfill以在所有浏览器中获得这些功能。
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
答案 6 :(得分:15)
好的,有几种方法可以做到这一点,但让我们从最简单的方法开始,这个函数叫做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}]
...
此方法将返回一个数组......
你也可以简单地使用循环,创建一个这样的函数:
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}]
答案 7 :(得分:14)
如果我理解正确,您希望在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;
});
答案 8 :(得分:12)
如果您正在寻找单个结果,而不是数组,我可以建议减少吗?
这是一个简单的javascript解决方案,如果存在匹配对象,则返回匹配对象;如果不存在,则返回null。
var result = arr.reduce(function(prev, curr) { return (curr.b === 6) ? curr : prev; }, null);
答案 9 :(得分:8)
您可以将它与箭头功能一起使用,如下所示:
var demoArray = [
{name: 'apples', quantity: 2},
{name: 'bananas', quantity: 0},
{name: 'cherries', quantity: 5}
];
var result = demoArray.filter( obj => obj.name === 'apples')[0];
console.log(result);
// {name: 'apples', quantity: 2}
答案 10 :(得分:4)
请参阅此文档https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
示例:
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 }
答案 11 :(得分:4)
只是将this answer的最快/最佳部分改进为更可重用/清晰:
function getElByPropVal(arr, prop, val){
for (var i = 0, length = arr.length; i < length; i++) {
if (arr[i][prop] == val){
return arr[i];
}
}
}
答案 12 :(得分:1)
通过特定属性值从对象数组中获取第一个对象:
function getObjectFromObjectsArrayByPropertyValue(objectsArray, propertyName, propertyValue) {
return objectsArray.find(function (objectsArrayElement) {
return objectsArrayElement[propertyName] == propertyValue;
});
}
function findObject () {
var arrayOfObjectsString = document.getElementById("arrayOfObjects").value,
arrayOfObjects,
propertyName = document.getElementById("propertyName").value,
propertyValue = document.getElementById("propertyValue").value,
preview = document.getElementById("preview"),
searchingObject;
arrayOfObjects = JSON.parse(arrayOfObjectsString);
console.debug(arrayOfObjects);
if(arrayOfObjects && propertyName && propertyValue) {
searchingObject = getObjectFromObjectsArrayByPropertyValue(arrayOfObjects, propertyName, propertyValue);
if(searchingObject) {
preview.innerHTML = JSON.stringify(searchingObject, false, 2);
} else {
preview.innerHTML = "there is no object with property " + propertyName + " = " + propertyValue + " in your array of objects";
}
}
}
&#13;
pre {
padding: 5px;
border-radius: 4px;
background: #f3f2f2;
}
textarea, button {
width: 100%
}
&#13;
<fieldset>
<legend>Input Data:</legend>
<label>Put here your array of objects</label>
<textarea rows="7" id="arrayOfObjects">
[
{"a": 1, "b": 2},
{"a": 3, "b": 4},
{"a": 5, "b": 6},
{"a": 7, "b": 8, "c": 157}
]
</textarea>
<hr>
<label>property name: </label> <input type="text" id="propertyName" value="b"/>
<label>property value: </label> <input type="text" id="propertyValue" value=6 />
</fieldset>
<hr>
<button onclick="findObject()">find object in array!</button>
<hr>
<fieldset>
<legend>Searching Result:</legend>
<pre id="preview">click find</pre>
</fieldset>
&#13;
答案 13 :(得分:0)
使用find with bind将特定键值传递给回调函数。
function byValue(o) {
return o.a === this.a && o.b === this.b;
};
var result = jsObjects.find(byValue.bind({ a: 5, b: 6 }));
答案 14 :(得分:0)
var result = jsObjects.filter(x=> x.b === 6);
会更好,在过滤器中使用return有时候你无法获得结果(我不知道为什么)
答案 15 :(得分:-30)
var jsObjects = [{a: 1, b: 2}, {a: 3, b: 4}, {a: 5, b: 6}, {a: 7, b: 8}];
要访问第三个对象,请使用:jsObjects[2];
要访问第三个对象b值,请使用:jsObjects[2].b;