例如,我已经包含了一个元素数组,它包含一个具有子类键的对象,它是对象的数组,每个对象E 29也有自己的E 110子代<代码>E 211键,其中包含另一个数组。
[
{
"Id": "1",
"Children": [
{
"Id": "2",
"Children": [
{
"Id": "10",
"DisplayName": "3-4",
},
{
"Id": "1000",
"DisplayName": "5-6",
},
{
"Id": "100",
"DisplayName": "1-2",
},
]
}
]
}
]有一个第二个对象数组,我希望将对象的第一个数组与进行比较,目的是确保第一个数组与对象的第二个数组E 222的顺序相同,如果不是--那么e 123排序e 224,直到它是。
下面是第二个数组:
[
{
"Id": "1",
"Children": [
{
"Id": "2",
"Children": [
{
"Id": "100",
"DisplayName": "1-2",
},
{
"Id": "10",
"DisplayName": "3-4",
},
{
"Id": "1000",
"DisplayName": "5-6",
},
]
}
]
}
]这将运行的数据可能会增加数万个,因此性能是最重要的。
我目前正在尝试的是使用实用程序方法将第二个数组的每个元素转换为对象的键控对象。
{
1: {
"Id": "1",
"Children": [
{
"Id": "2",
"Children": [
{
"Id": "4",
"DisplayName": "3-4",
},
{
"Id": "3",
"DisplayName": "1-2",
},
]
}
]
}
}这允许从顶层快速查找。我想知道我是否应该一直这样下去,或者是否有一种惯用的方法来完成这个任务。我也考虑过递归。已经排序的数组的顺序不是基于Id -它是任意的。因此,无论怎样,秩序都需要被保留。
发布于 2018-08-03 00:17:45
假设每个对象的每个级别都存在相同的深度和所有Id,则使用一个递归函数,该函数在排序回调中使用Array#findIndex()匹配
function sortChildren(main, other) {
other.forEach((o, i) => {
if (o.children) {
const mChilds = main[i].children, oChilds = o.children;
oChilds.sort((a, b) => {
return mChilds.findIndex(main => main.Id === a.Id) - mChilds.findIndex(main => main.Id === b.Id)
});
// call function again on this level passing appropriate children arrays in
sortChildren(mChilds, oChilds)
}
})
}
sortChildren(data, newData);
console.log(JSON.stringify(newData, null, ' '))<script>
var data = [{
"Id": "1",
"Children": [{
"Id": "2",
"Children": [{
"Id": "3",
"DisplayName": "1-2",
},
{
"Id": "4",
"DisplayName": "3-4",
},
]
}]
}]
var newData = [{
"Id": "1",
"Children": [{
"Id": "2",
"Children": [{
"Id": "4",
"DisplayName": "3-4",
},
{
"Id": "3",
"DisplayName": "1-2",
},
]
}]
}]
</script>
https://stackoverflow.com/questions/51663557
复制相似问题