javascript - 将数组重新映射到对象

标签 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": "siamese"
}, {
  "field1": "cats",
  "field2": "persian"
}, {
  "field1": "fish",
  "field2": "guppy"
}, {
  "field1": "fish",
  "field2": "tiger barb"
}]

我想遍历数组并创建一个新数组 Pets,这样我就可以像访问它一样

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

但不知何故 Pets[i-1].type 不被识别为对象。

我想首先根据记录中的 3 种宠物在数组 Pets 中创建 3 个对象,然后排序品种的第二个顺序(应该更容易插入数组。我有一个大记录,所以循环会有很大帮助。

最佳答案

首先按类型对宠物进行分组,然后将结果重新格式化为数组会简单得多:

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

.hasOwnProperty 检查是 standard procedure避免来自第三方代码的令人不快的意外。

关于javascript - 将数组重新映射到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28182367/

相关文章:

javascript - 如何使用 CHECKBOX 更改 SELECT 中的选项而不刷新

javascript - aJax 使用按钮更新 sqlite 和 php 中的特定行

javascript - ChartJS 单击栏并更改其背景颜色

javascript - 对或错 : Declaring array and calling function on same line, javaScript

jquery - 使用Jquery如何区分对象值是数组还是只是值..?

C++ 对象和内存分配

javascript - express4.2.0 session 未定义

javascript - 使用 unshift 和 pop 序列处理对象数组

javascript - 如何避免重复对象?

arrays - 如果在多个数组中找到,则删除行