【发布时间】:2015-05-29 11:09:58
【问题描述】:
我需要一些帮助来完成一项相当简单但具有挑战性的(对我来说:)编程任务。
有两个数组对象,一长一短:
var arrayShort = [
{
id: 'A',
name: 'first'
},{
id: 'B',
name: 'second'
},{
id: 'C',
name: 'third'
}
]
var arrayLong = [
{
id: 'A',
name: 'firstSub1'
},{
id: 'A',
name: 'firstSub2'
},{
id: 'A',
name: 'firstSub3'
},{
id: 'B',
name: 'secondSub1'
},{
id: 'B',
name: 'secondSub2'
},{
id: 'B',
name: 'secondSub3'
},{
id: 'C',
name: 'thirdSub1'
},{
id: 'C',
name: 'thirdSub2'
},{
id: 'C',
name: 'thirdSub3'
}
]
我如何根据共享 ID 将它们合并在一起,以获得以下信息:
var arrayCombined = [
{
id: 'A',
name: 'first'
},{
id: 'A',
name: 'firstSub1'
},{
id: 'A',
name: 'firstSub2'
},{
id: 'A',
name: 'firstSub3'
},{
id: 'B',
name: 'second'
},{
id: 'B',
name: 'secondSub1'
},{
id: 'B',
name: 'secondSub2'
},{
id: 'B',
name: 'secondSub3'
},{
id: 'C',
name: 'third'
},{
id: 'C',
name: 'thirdSub1'
},{
id: 'C',
name: 'thirdSub2'
},{
id: 'C',
name: 'thirdSub3'
},
]
重要
顺序很重要。
我尝试过的
for (var i = 0; i < arrayShort.length; i++) {
var itemShort = arrayShort[i]
console.log(itemShort)
for (var j = 0; j < arrayLong.length; j++) {
var itemLong = arrayLong[j]
if (itemLong.id === itemShort.id) {
console.log(itemLong)
arrayShort.splice(j + 1, 0, arrayLong)
}
}
}
var arrayCombined = arrayShort
console.log(arrayCombined)
这会导致无限循环,但我不知道为什么。一般来说,我知道嵌套循环和条件是坏消息。
有什么更好的方法来解决这个问题(精神上,使用代码等)?
Here's a Codepen,打开开发工具看看
注意事项:
- 首选Vanilla Javascript 解决方案,但最好看看使用Lodash 或Underscores 执行此操作的方法。一般来说,我觉得这两个库中的任何一个都可以使这种类型的任务变得超级简单,但我似乎永远无法弄清楚到底是如何做到的。
- 尝试为此找到正确的搜索词非常困难...建议?
感谢反馈/见解。
【问题讨论】:
-
由于两个列表似乎都已排序且顺序相同,因此请使用 en.wikipedia.org/wiki/Merge_algorithm
-
arrayShort.splice(j + 1, 0, arrayLong)是个坏主意。最好尝试构建一个新数组,它更容易更干净。 -
@Bergi 感谢您向我指出合并算法。是的,我当然看到拼接,尤其是在嵌套丛林中,是一种不好的方法 - 因此我提出了这个问题。
-
另外,很重要的一点是要指出这些来自同一个大
jsonblob,我正在接收并需要从外部 API 解析成我想要的数据结构。跨度> -
@IsaacGregson 如果您期望一个大的 json blob,那么我认为您不应该采用排序方法。那是更少的代码,但你会为性能付出代价。
标签: javascript arrays json loops lodash