如何在数组中选择对象具有“slug”键值“A”的对象?
例如,如果我有这个:
var allItems = [
{
"slug": "henk",
"company_founded": "2008",
"company_category": "Clean",
"company_logo": false,
"company_description": "",
}
{
"id": "bas",
"company_founded": "2012",
"company_category": "Health",
"company_logo": false,
"company_description": "",
}
{
"slug": "jan",
"company_founded": "2005",
"company_category": "Clean",
"company_logo": false,
"company_description": "",
}
]
我想要的是将包含slug:henk的对象放在一个新变量中。
所以我会有这样的东西可以使用:
var = SelectedItem = {
"slug": "henk",
"company_founded": "2012",
"company_category": "Health",
"company_logo": false,
"company_description": "",
}
谢谢!
答案 0 :(得分:1)
您必须迭代您的列表,并根据您的条件采取您正在寻找的元素:
var result;
for each (var item in allItems ) {
if(item.company_founded === "2012") {
result = item;
break;
}
}
答案 1 :(得分:1)
您可以考虑将值存储在由预期键索引的对象中,例如:
var allItems = {
"henk":
{
"slug": henk,
"company_founded": "2008",
"company_category": "Clean",
"company_logo": false,
"company_description": "",
},
"bas":
{
"id": bas,
"company_founded": "2012",
"company_category": "Health",
"company_logo": false,
"company_description": "",
}
]
这允许您检索allItems.henk
它的索引速度更快,因为它是一个对数散列表,而不是完整的迭代。
-----编辑----
如果您需要提前对其进行转换以加速查找,只要生成新结构的成本低于您将要执行的查找的成本。你能做到,
var allItemsByKey = {}
for(var i = 0, l = allItems.length; i<l; i++){
var item = allItems[i];
allItemsByKey[item.slug] = item;
}
然后allItemsByKey
具有上面演示的结构
答案 2 :(得分:1)
您可能想要查看Array.prototype.find
:
var obj = allItems.find(function(el){
return el.slug === 'henk';
});
答案 3 :(得分:1)
对于混合对象,您可以遍历所有属性并仅返回某些属性具有特定值的对象。
var allItems = [{ "slug": "henk", "company_founded": "2008", "company_category": "Clean", "company_logo": false, "company_description": "", }, { "id": "bas", "company_founded": "2012", "company_category": "Health", "company_logo": false, "company_description": "", }, { "slug": "jan", "company_founded": "2005", "company_category": "Clean", "company_logo": false, "company_description": "", }],
result = allItems.filter(function (a) {
return Object.keys(a).some(function (k) {
return a[k] === 'henk';
});
});
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
答案 4 :(得分:1)
使其一致:对象数组(在逗号之间插入逗号,将id更改为slug以匹配其他对象。)
假设该属性是唯一的,或者它将在列表中获得最后一个。就像ID查找或其他一样。
已编辑以显示复杂对象与简单数组之间的值 EDIT2 :按类别添加第二次查找
var allItems = {"fred":"H fred",rats:"rats",lookupitems: [{
"slug": "henk",
"company_founded": "2008",
"company_category": "Clean",
"company_logo": false,
"company_description": "",
} ,{
"slug": "bas",
"company_founded": "2012",
"company_category": "Health",
"company_logo": false,
"company_description": "",
}, {
"slug": "jan",
"company_founded": "2005",
"company_category": "Clean",
"company_logo": false,
"company_description": "",
}]};
创建一个我们可以以可重复的方式使用的查找:
var lookup = {};
var lookupbycategory = {};
// create reference to list above and use it everywhere
lookup.list = allItems.lookupitems;
for (var i = 0, len = lookup.list.length; i < len; i++) {
lookup[lookup.list[i].slug] = lookup.list[i];
lookupbycategory[lookup.list[i].company_category] = lookup.list[i];
}
获得一个(使用它)
var mychoice = lookup["henk"];
alert(JSON.stringify(mychoice));
alert(JSON.stringify(lookupbycategory["Clean"]));
重复使用
var mybas = lookup["bas"];