我有一个对象数组,如下所示:
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循环是否是最有效的方法。有没有更快更好的方法?
答案 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