按对象值获取数组项

时间:2015-09-24 09:27:09

标签: javascript arrays json object for-loop

我有一个对象数组,如下所示:

var entries = [
  { sys: {id:"1"}, fields: "article1" },
  { sys: {id:"2"}, fields: "place1" },
  { sys: {id:"3"}, fields: "offer2" },
  { sys: {id:"1"}, fields: "article2" },
  { sys: {id:"1"}, fields: "article3" },
  { sys: {id:"3"}, fields: "offer2" },
  { sys: {id:"2"}, fields: "place2" }
];

现在我想将其拆分为3个数组,以容纳每个sys.id个数字。结果应如下所示:

var articles = [
  { sys: {id:"1"}, fields: "article1" },
  { sys: {id:"1"}, fields: "article2" },
  { sys: {id:"1"}, fields: "article3" }
];

var places = [
  { sys: {id:"2"}, fields: "place1" },
  { sys: {id:"2"}, fields: "place2" }
];

var offers = [
  { sys: {id:"3"}, fields: "offer2" },
  { sys: {id:"3"}, fields: "offer2" }
];

我已经通过以下for循环实现了这一目标:

var places = [], offers = [], articles = [];

for (i=0; i<entries.length; i++) {
  if (entries[i].sys.id === "1") results.articles.push(entries[i]);
  else if (entries[i].sys.id === "2") results.places.push(entries[i]);
  else if (entries[i].sys.id === "3") results.offers.push(entries[i]);
}

然而,我需要以这种方式排序的初始数据集会更大,具有更多膨胀的对象,因此我不确定for循环是否是最有效的方法。有没有更快更好的方法?

3 个答案:

答案 0 :(得分:3)

这是一个简单的可重用函数,可以与[] .filter()一起使用:

function byID(obj){ return obj.sys.id==this;}

var places = entries.filter(byID, 1), 
 offers = entries.filter(byID, 2), 
 articles = entries.filter(byID, 3);

正如您所看到的,与for循环相比,它减少了编写扩展它所需的代码量。

你可以通过一个简单的包装器来扩展单一用途的案例更加简洁:

 function filt(n){
    return entries.filter(function byID(obj){ 
      return obj.sys.id==this;
    }, n);
 }

 var places = filt(1), 
 offers = filt(2), 
 articles = filt(3);

我使用了==这样你就可以使用引号或实数来显示所显示数据中的数字 - 字符串,但是如果你想要严格,那么添加“use strict”和===来filter()回调。

答案 1 :(得分:0)

您可以使用过滤方法进行简化:

 entries.filter(function(x){return x.sys.id ==1})

答案 2 :(得分:0)

我这样做

function setclass(scope, name) scope[name] = newclass(name) end