javascript - LoDash - 如何通过公用 key 将一个集合值推送到另一个集合中

标签 javascript arrays multidimensional-array lodash

我有两个收藏。

var a = 
[
 {unique_id: "001", state: "CO"},
 {unique_id: "001", state: "TX"},
 {unique_id: "001", state: "CC"},
 {unique_id: "002", state: "CC"},
 {unique_id: "002", state: "NY"}
]

还有

var b = 
[
 {unique_id: "001", states:[]},
 {unique_id: "002", states:[]}
]

我想要得到:

var b = 
[
 {unique_id: "001", states:["CO","TX","CC"]},
 {unique_id: "002", states:["CC","NY"]}
]

我应该提到,“b”数组必须保持相同的顺序,并且某些 unique_id 没有值。

我一直在尝试使用 LoDash https://lodash.com/ - 所以如果有人能用 LoDash 解决这个问题那就太棒了!

最佳答案

此解决方案的时间复杂度不是最优的 ( O(n^2) ),但它可能会帮助您想出将值插入“b”的匹配方法:

_.forEach(a, function(element1){
  _.forEach(b, function(element2){
    if (element2.unique_id === element1.unique_id) {
     element2.states.push(element1.state);
    }
  });
});

也许更好的解决方案可能是使用 lodash 的 _.indexBy 方法通过其唯一 ID 来索引 b 中的对象。例如,您可以按如下方式在 b 中索引对象:

var c = _.indexBy(b, 'unique_id')

这将导致:

{001:{unique_id: "001", states:[]}, 002: {unique_id: "002", states:[]}}

由于 c 数组中的对象与 b 数组中的对象指向内存中的相同对象,因此我们可以直接改变 c 中的对象,而 b 将引用内存中那些更新的对象。所以:

_.forEach(a, function(element1){
  if (element1.unique_id in c) {
    c[element1.unique_id].states.push(element1.state);
  }
})

现在,如果我们看一下 b 数组,我们会看到该值是:

var b = 
[
 {unique_id: "001", states:["CO","TX","CC"]},
 {unique_id: "002", states:["CC","NY"]}
]

这个解决方案的时间复杂度应该接近 O(n),这比使用嵌套的 _.forEach 方法要好得多。代码片段:

var a = 
[
 {unique_id: "001", state: "CO"},
 {unique_id: "001", state: "TX"},
 {unique_id: "001", state: "CC"},
 {unique_id: "002", state: "CC"},
 {unique_id: "002", state: "NY"}
];

var b = 
[
 {unique_id: "001", states:[]},
 {unique_id: "002", states:[]}
];

var c = _.indexBy(b, 'unique_id');

_.forEach(a, function(element1){
  if (element1.unique_id in c) {
    c[element1.unique_id].states.push(element1.state);
  }
});

document.writeln(JSON.stringify(b))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.9.3/lodash.js"></script>

关于javascript - LoDash - 如何通过公用 key 将一个集合值推送到另一个集合中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30946055/

相关文章:

javascript - Angular2将Firebase的响应保存到模型

javascript - 我需要有关此回文代码的帮助

javascript - 在javascript中从dd-MMM-yyyy到dd-MM-yyyy的日期格式转换

javascript - 如何使用 nuxtjs 在 vue 模板上添加标题和脚本

c# - 遍历 BitArray 中所有可能的值组合

c# - 索引超出了数组困惑的范围

mysql - SQL 检索多维数组

java - 解释java中的clone()函数

c - 为什么当我尝试写入文件时会出现奇怪的字符?

java - 当尝试通过读取文件打印二维数组时,我的输出收到 Null