我有两个收藏。
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/