Javascript 将数组重新映射到对象
我有这样一个数组:Javascript 将数组重新映射到对象,javascript,arrays,object,dictionary,Javascript,Arrays,Object,Dictionary,我有这样一个数组: var records = [{ "field1": "dogs", "field2": "poodle" }, { "field1": "dogs", "field2": "alsatian" }, { "field1": "dogs", "field2": "chowchow" }, { "field1": "dogs", "field2": "schnauzer" }, { "field1": "cats", "field2":
var records = [{
"field1": "dogs",
"field2": "poodle"
}, {
"field1": "dogs",
"field2": "alsatian"
}, {
"field1": "dogs",
"field2": "chowchow"
}, {
"field1": "dogs",
"field2": "schnauzer"
}, {
"field1": "cats",
"field2": "siamese"
}, {
"field1": "cats",
"field2": "persian"
}, {
"field1": "fish",
"field2": "guppy"
}, {
"field1": "fish",
"field2": "tiger barb"
}]
我想迭代数组并创建一个新的数组,这样我就可以像这样访问它
var Pets = [{
"type": "dogs",
"breeds": ["poodle", "alsatian", "chowchow", "schnauzer"]
}, {
"type": "cats",
"breeds": ["siamese", "persian"]
}, {
"type": "fish",
"breeds": ["guppy", "tiger barb"]
}]
我试图做一个for循环,但它不起作用,因为我在这样的数组中使用I+1
var thispet = {};
var Pets = [];
thispet.type = records[0].field1;
Pets.push(thispet);
for (i = 1; i < records.length; i++) {
if (Pets[i - 1].type != records[i].field1) {
thispet.type = records[i] field1;
Pets.push(thispet);
}
}
var thispet={};
var=[];
thispet.type=记录[0]。字段1;
宠物。推(这个宠物);
对于(i=1;i
但不知何故,Pets[i-1]类型无法识别为对象
我想首先根据记录中的3种宠物类型在宠物阵列中创建3个对象,然后对第二顺序的品种进行排序(使用push-in-array应该更容易。我有一个很大的记录,所以循环将非常有用。首先按类型对宠物进行分组,然后将结果重新格式化为一个阵列会简单得多:
var group, pets = [], groups = {};
for (var i = 0; i < records.length; ++i) {
group = groups[records[i].field1] || groups[records[i].field1] = [];
group.push(records[i].field2);
}
for (var type in groups) {
if (!groups.hasOwnProperty(type)) continue; // just to be on the safe side
pets.push({ type: type, breeds: groups[type] });
}
var组,pets=[],groups={};
对于(变量i=0;i
.hasOwnProperty
检查是为了避免第三方代码带来不愉快的惊喜。首先按类型将宠物分组,然后将结果重新格式化为一个数组会简单得多:
var group, pets = [], groups = {};
for (var i = 0; i < records.length; ++i) {
group = groups[records[i].field1] || groups[records[i].field1] = [];
group.push(records[i].field2);
}
for (var type in groups) {
if (!groups.hasOwnProperty(type)) continue; // just to be on the safe side
pets.push({ type: type, breeds: groups[type] });
}
var组,pets=[],groups={};
对于(变量i=0;i
.hasOwnProperty
检查是为了避免第三方代码带来不愉快的惊喜。ECMA5中可能的解决方案
var记录=[{
“场1”:“狗”,
“场2”:“贵宾犬”
}, {
“场1”:“狗”,
“字段2”:“阿尔萨斯”
}, {
“场1”:“狗”,
“字段2”:“chow”
}, {
“场1”:“狗”,
“场2”:“雪纳瑞”
}, {
“领域1”:“猫”,
“字段2”:“暹罗语”
}, {
“领域1”:“猫”,
“字段2”:“波斯语”
}, {
“场1”:“鱼”,
“字段2”:“孔雀鱼”
}, {
“场1”:“鱼”,
“字段2”:“老虎倒钩”
}],
x=记录。减少(功能(acc,记录){
如果(!acc[记录字段1]){
acc[记录字段1]=[];
}
if(acc[record.field1].indexOf(record.field2)=-1){
acc[record.field1].push(record.field2);
}
返回acc;
}, {}),
y=对象。键(x)。映射(函数(键){
返回{
类型:键,
品种:这个[钥匙]
};
},x);
document.getElementById('out').textContent=JSON.stringify(y,null,2);
ECMA5中可能的解决方案
var记录=[{
“场1”:“狗”,
“场2”:“贵宾犬”
}, {
“场1”:“狗”,
“字段2”:“阿尔萨斯”
}, {
“场1”:“狗”,
“字段2”:“chow”
}, {
“场1”:“狗”,
“场2”:“雪纳瑞”
}, {
“领域1”:“猫”,
“字段2”:“暹罗语”
}, {
“领域1”:“猫”,
“字段2”:“波斯语”
}, {
“场1”:“鱼”,
“字段2”:“孔雀鱼”
}, {
“场1”:“鱼”,
“字段2”:“老虎倒钩”
}],
x=记录。减少(功能(acc,记录){
如果(!acc[记录字段1]){
acc[记录字段1]=[];
}
if(acc[record.field1].indexOf(record.field2)=-1){
acc[record.field1].push(record.field2);
}
返回acc;
}, {}),
y=对象。键(x)。映射(函数(键){
返回{
类型:键,
品种:这个[钥匙]
};
},x);
document.getElementById('out').textContent=JSON.stringify(y,null,2);
好的,我来试试。好的,我来试试。