【问题标题】:Group Javascript array of objects by ID按 ID 对对象的 Javascript 数组进行分组
【发布时间】:2016-09-22 09:13:59
【问题描述】:

如果 ID 的前两位数字匹配,我想要实现的是在数组中将对象组合在一起。所以给定下面的对象数组,我想转换这个 ORIGINAL ARRAY:

[
    {
        "id": "0100",
        "name": "name 1",
        "message": "Lorem blah blah 1"
    },
    {
        "id": "0101",
        "name": "",
        "message": "Lorem blah blah 1.1"
    },
    {
        "id": "0200",
        "name": "name 2",
        "message": "Lorem blah blah 2"
    },
    {
        "id": "0201",
        "name": "",
        "message": "Lorem blah blah 2.1"
    },
    {
        "id": "0202",
        "name": "",
        "message": "Lorem blah blah 2.2"
    },
    {
        "id": "0300",
        "name": "name 3",
        "message": "Lorem blah blah 3"
    },
    {
        "id": "0301",
        "name": "",
        "message": "Lorem blah blah 3.1"
    },
    {
        "id": "0302",
        "name": "",
        "message": "Lorem blah blah 3.2"
    },
    {
        "id": "0303",
        "name": "",
        "message": "Lorem blah blah 3.3"
    },
    {
        "id": "0304",
        "name": "",
        "message": "Lorem blah blah 3.4"
    }
]

进入这个新阵列:

[
    {
        "id": "0100",
        "name": "name 1",
        "message": [
            "Lorem blah blah 1",
            "Lorem blah blah 1.1"
        ]
    },
    {
        "id": "0200",
        "name": "name 2",
        "message": [
            "Lorem blah blah 2",
            "Lorem blah blah 2.1",
            "Lorem blah blah 2.2"
        ]
    },
    {
        "id": "0300",
        "name": "name 3",
        "message": [
            "Lorem blah blah 3",
            "Lorem blah blah 3.1",
            "Lorem blah blah 3.2",
            "Lorem blah blah 3.3",
            "Lorem blah blah 3.4"
        ]
    }
]

要注意的关键是,如果 ID 的前两位数字相同,则将这些对象中的消息添加在一起,如 NEW ARRAY 中所示。

正如大家所见,@Nenad Vracar 已经为上述挑战展示了一个不错的答案,但是,我还有一个涉及另一个数组的问题:

`var data2 = [{"CandidateName": "Mary", "relatedId": ["0100"]},{ "CandidateName": "John", "relatedId": ["0200"]},{ "CandidateName":"Peter", "relatedId": ["0300"]},{ "CandidateName": "Paul", "relatedId": ["0300"]}];`

我想在其中提取“candidateName”并将其作为数组添加到原始数组“result”中。

我在 data1.reduce 循环中尝试了一个 data2.forEach 循环,但它似乎挂起。

var result = data.reduce(function(r, el) {

  // THIS INNER LOOP MAKES THE BROWSER HANG!!!
  data2.forEach(function (a){
    console.log('a',a); 
  });

  var e = el.id.slice(0, 2);
  if (!o[e]) {
    o[e] = {
      id: el.id,
      name: el.name,
      message: []
    }
    r.push(o[e]);
  }
  o[e].message.push(el.message);
  return r;
}, [])

我想知道是否有更优雅、更复杂的方法不会破坏?

【问题讨论】:

  • 好像是有序数组
  • 如果我将这个问题作为一个新问题提出来,我如何在不失去动力的情况下扩展这个问题?我可以在这里用 cmets 提问吗?如果是的话,就这样吧?
  • 我来寻求进一步的帮助。我还有另一个数组:var data2 = [{"CandidateName": "Mary", "relatedId": ["0100"]},{ "CandidateName": "John", "relatedId": ["0200"]},{ "CandidateName":"Peter", "relatedId": ["0300"]},{ "CandidateName": "Paul", "relatedId": ["0300"]}];,我想在其中提取“candidateName”并将其作为数组添加到原始数组“result”中。我在 data1.reduce 循环中尝试了一个 data2.forEach 循环,但它似乎挂起。我想知道是否有更优雅、更复杂的方法不会破坏?

标签: javascript arrays


【解决方案1】:

您可以使用reduce()返回数组和一个对象进行分组。

var data = [{"id":"0100","name":"name 1","message":"Lorem blah blah 1"},{"id":"0101","name":"","message":"Lorem blah blah 1.1"},{"id":"0200","name":"name 2","message":"Lorem blah blah 2"},{"id":"0201","name":"","message":"Lorem blah blah 2.1"},{"id":"0202","name":"","message":"Lorem blah blah 2.2"},{"id":"0300","name":"name 3","message":"Lorem blah blah 3"},{"id":"0301","name":"","message":"Lorem blah blah 3.1"},{"id":"0302","name":"","message":"Lorem blah blah 3.2"},{"id":"0303","name":"","message":"Lorem blah blah 3.3"},{"id":"0304","name":"","message":"Lorem blah blah 3.4"}];

var o = {}
var result = data.reduce(function(r, el) {
  var e = el.id.slice(0, 2);
  if (!o[e]) {
    o[e] = {
      id: el.id,
      name: el.name,
      message: []
    }
    r.push(o[e]);
  }
  o[e].message.push(el.message);
  return r;
}, [])

console.log(result)

【讨论】:

  • Ahhh Nenad Vracar 你对我来说太快了。我只是设置了我为@Blaze Sahlzen 尝试过的东西,这里有一个实际可行的解决方案。谢谢你的朋友。棒极了!!完美的答案。不确定我是否可以投票,但如果我不能,我象征性地投票给你,伙计。这非常有效。
  • 很高兴我能帮上忙。
  • 我来寻求进一步的帮助。我还有另一个数组:var data2 = [{"CandidateName": "Mary", "relatedId": ["0100"]},{ "CandidateName": "John", "relatedId": ["0200"]},{ "CandidateName":"Peter", "relatedId": ["0300"]},{ "CandidateName": "Paul", "relatedId": ["0300"]}];,我想在其中提取“candidateName”并将其作为数组添加到原始数组“result”中。我在 data1.reduce 循环中尝试了一个 data2.forEach 循环,但它似乎挂起。我想知道是否有更优雅、更复杂的方法不会破坏?
【解决方案2】:

您可以检查双零并将新组添加到结果集中。

var data = [{ "id": "0100", "name": "name 1", "message": "Lorem blah blah 1" }, { "id": "0101", "name": "", "message": "Lorem blah blah 1.1" }, { "id": "0200", "name": "name 2", "message": "Lorem blah blah 2" }, { "id": "0201", "name": "", "message": "Lorem blah blah 2.1" }, { "id": "0202", "name": "", "message": "Lorem blah blah 2.2" }, { "id": "0300", "name": "name 3", "message": "Lorem blah blah 3" }, { "id": "0301", "name": "", "message": "Lorem blah blah 3.1" }, { "id": "0302", "name": "", "message": "Lorem blah blah 3.2" }, { "id": "0303", "name": "", "message": "Lorem blah blah 3.3" }, { "id": "0304", "name": "", "message": "Lorem blah blah 3.4" }],
    grouped = [];

data.forEach(function (a) {
    var key = a.id.slice(0, 2);
    if (a.id === key + '00') {
        this[key] = { id: a.id, name: a.name, message: [] };
        grouped.push(this[key]);
    }
    this[key].message.push(a.message);
}, Object.create(null));

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 关于双零问题的有趣点。我会将其包含在我的代码中。您的答案与@Nenad Vracar 非常接近,所以也感谢您。我似乎无法让它在我的代码中工作。我在这一行收到“未定义消息”的错误:this[key].message.push(a.message);但是,我知道它可以在运行代码 sn-p 窗口中工作。感谢您强调双零问题。临时投票!
  • 可能你的数据没有按id排序。如果是这种情况,这两个建议都不起作用。
猜你喜欢
  • 2022-12-16
  • 2020-02-29
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-14
  • 1970-01-01
相关资源
最近更新 更多