如何在JS

时间:2016-01-28 21:03:52

标签: javascript arrays json object

如何在数组中选择对象具有“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": "",
}

谢谢!

5 个答案:

答案 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"];