Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/453.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按对象值获取数组项_Javascript_Arrays_Json_Object_For Loop - Fatal编程技术网

Javascript 按对象值获取数组项

Javascript 按对象值获取数组项,javascript,arrays,json,object,for-loop,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"},

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

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" }
];
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" }
];
现在我想把它分成3个数组,以容纳每个
sys.id
数字。结果应该如下所示:

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" }
];
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]);
}
var places=[]、offers=[]、articles=[];

对于(i=0;i,可以使用过滤方法进行简化:

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

下面是一个简单的可重用函数,可与[]一起使用。filter()

如您所见,与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()回调中。

我这样做

var map = [
    ["1", "articles"],
    ["2", "places"],
    ["3", "offers"]
].reduce(function(acc, pair) {
    acc[pair[0]] = pair[1]
    return acc;
}, {});

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" }
];

// map and entries can come from a dataset
// this way you can have many different sys.id s 

// hash is your final result
var hash = entries.reduce(function(acc, a) {
   var key = map[a.sys.id];
   acc[key] = acc[key] || [];
   acc[key].push(a);
   return acc;
}, {});

如果你的代码工作正常,那么就不是询问的地方。也许可以试试CodeReview。你不太可能找到比你现在更有效的方法,但是会有其他方法来做(例如,)@takendarkk该代码适用于小数据集是的。但我在问题中解释过,我认为这对较大的数据集不起作用,因此可能需要另一种方法。小心过早的优化。用较大的数据尝试一下,看看这是否是一个问题。你没有进行任何不必要或昂贵的调用。没有太多的脂肪需要修剪就性能而言,他的实例。@coop是的,我理解,我可以阅读你的问题。但是,由于你没有在大型数据集上尝试过,这意味着你的代码可以按原样工作。如果你在大型数据集上运行它,速度很慢,并且你发现了瓶颈,那么这是一个需要问的特定问题。
var map=“,文章,地点,提供”。拆分(,”;
也有同样的功能,而且编码更简单…;)-只需跳过零,就可以通过数组找到一个很好的字符串查找机制…或者只需
var-map={1:“文章”,2:“地点”,3:“提供”}
如果你需要稀疏…问题是他的
sys.id
s是字符串而不是整数js中的所有键都是字符串(包括数组索引),尽管由于它是松散类型的,所以加倍并不重要…好消息,嗯?