javascript - 从一个数组中提取项目并添加到现有数组 Javascript

标签 javascript arrays sorting

我有现有的数组,并且想向 ID 匹配的每个项目添加另一个对象数组。

var existingData = [
    {
        "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"
        ]
    }
];

下面的数组是我的第二个数组,其中“relatedId”将与现有数组中的 ID 相同:

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

如果 ID 匹配,我想从 data2 中提取“CandidateName”并将其放入现有数据中。

此特定问题已从此处扩展 => Group Javascript array of objects by ID

我已经尝试过了,但由于浏览器挂起,我并没有走得太远:

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

所以我想以这样的方式结束:

var existingData = [
    {
        "id": "0100",
        "name": "name 1",
        "message": [
            "Lorem blah blah 1",
            "Lorem blah blah 1.1"
        ],
        "CandidateName": ["Mary", "Peter"]
    },
    {
        "id": "0200",
        "name": "name 2",
        "message": [
            "Lorem blah blah 2",
            "Lorem blah blah 2.1",
            "Lorem blah blah 2.2"
        ],
        "CandidateName": ["Mary", "John"]
    },
    {
        "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"
        ],
        "CandidateName": ["Peter", "Paul"]
    }
]

最佳答案

data2 创建 HashMap 要高效得多,因此您只需迭代该数组一次。键将是 id 的

然后在迭代 existingData 时,这是一个简单的合并

var candidatesById = data2.reduce(function(a, c){
   c.relatedId.forEach(function(id){
       a[id] = a[id] || [];
       a[id].push(c.CandidateName);           
   });
   return a;
},{});

existingData.forEach(function(item){
    item.CandidateName = candidatesById[item.id] || [];// empty array if no match
})

关于javascript - 从一个数组中提取项目并添加到现有数组 Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39709805/

相关文章:

javascript - 更改 Angular 中的路线会导致重新评估先前路线 Controller 上的功能

Javascript:标记数组结果

c - C 中的指针和重新分配

shell - 如何在Unix中应用具有相同输入和输出文件的sort和uniq?

arrays - 数组变异算法

sql - first_value() over (order by something asc) 应该与 last_value () over (order by something desc) 相同吗?

javascript - 如何从异步调用返回响应?

javascript - 通过 javascript 从时间线获取笔记输入控件

c - 动态字符串输入并在 C 中对它们进行排序

javascript - 如何正确制作此动画?