繁体   English   中英

如何在JS中选择具有特定值的数组内的对象

[英]How to select an object inside array that has a specific value in JS

如何在数组中选择一个对象,该对象的“ 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的对象放入新变量中。

因此,我将可以使用以下方法:

var = SelectedItem = {
    "slug": "henk",
    "company_founded": "2012",
    "company_category": "Health",
    "company_logo": false,
    "company_description": "",
}

谢谢!

您将不得不对列表进行迭代,并根据您的情况选择所需的元素:

var result;
for each (var item in allItems ) {
    if(item.company_founded === "2012") {
        result = item; 
        break;
    }
}

您可以考虑将值存储在按预期键索引的对象中,例如:

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具有上面演示的结构

您可能需要查看Array.prototype.find

 var obj = allItems.find(function(el){
     return el.slug === 'henk';
 });

对于混合对象,可以遍历所有属性,仅返回某些属性具有特定值的对象。

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

使其一致:对象数组(使用逗号分隔,将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"];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM