操作 object 以便它自己的属性填充 object 本身内的数组
Manipulate object so that its own properties populate arrays inside the object itself
我有一个像这样的 objects 数组:
var array = [{
code : "1",
name : "code1",
parentCode : "0",
children : []
},{
code : "0",
name : "code0",
parentCode : "#",
children : []
}]
如何将 parent 的代码推送到 parent 的 children
数组?理想情况下,推送后,array[1].children
应该是 ["1"]
我试过:
for (var i = 0; i<array.length;i++) {
var parentArray = array.find(function(a){
return a.parentCode == array[i].parentCode
});
parentArray.children.push(array[i].code);
}
结果是打乱的。 children 数组包含完全没有意义的条目组合(原本不属于那里的条目,因为它们的 parent 不同)
我应该换一种方式吗?
这是我想要完成的 before/after 的示例:
之前:
var array = [{
code : "0",
name : "code0",
parentCode : "#",
children : []
},{
code : "1",
name : "code1",
parentCode : "0",
children : []
},{
code : "2",
name : "code2",
parentCode : "0",
children : []
},{
code : "3",
name : "code3",
parentCode : "0",
children : []
},{
code : "4",
name : "code4",
parentCode : "1",
children : []
},{
code : "5",
name : "code5",
parentCode : "1",
children : []
}]
之后(期望的结果):
var array = [{
code : "0",
name : "code0",
parentCode : "#",
children : ["1","2","3"]
},{
code : "1",
name : "code1",
parentCode : "0",
children : ["4","5"]
},{
code : "2",
name : "code2",
parentCode : "0",
children : []
},{
code : "3",
name : "code3",
parentCode : "0",
children : []
},{
code : "4",
name : "code4",
parentCode : "1",
children : []
},{
code : "5",
name : "code5",
parentCode : "1",
children : []
}]
我可能会分两次执行此操作(但请参阅下文):
找到所有 parent 并通过代码构建对它们的引用映射
找到所有的children,将他们推到parents
像这样:
// The data
var array = [{ code : "0", name : "code0", parentCode : "#", children : [] },{ code : "1", name : "code1", parentCode : "0", children : [] },{ code : "2", name : "code2", parentCode : "0", children : [] },{ code : "3", name : "code3", parentCode : "0", children : [] },{ code : "4", name : "code4", parentCode : "1", children : [] },{ code : "5", name : "code5", parentCode : "1", children : [] }];
// Build a mapping object of parents keyed by their codes
var map = Object.create(null);
array.forEach(function(entry) {
map[entry.code] = entry;
});
// Push child codes into the parent `children` arrays
array.forEach(function(entry) {
if (entry.parentCode != "#") {
var parent = map[entry.parentCode];
if (parent) {
parent.children.push(entry.code);
}
}
});
// Show result
console.log(array);
分两次进行的原因是为了避免在 array
中进行不必要的搜索,寻找每个 parent。在 "mapping" object 中查找条目比在数组中查找条目更有效。
但如果您想一次性完成,您的 find
方法也可以。您尝试的问题是您将 parentCode
与 parentCode
进行比较(您应该将 child 的 parentCode
与 child 的 code
),并且您不允许找不到 parent(也许您确定它们将永远存在):
// The data
var array = [{ code : "0", name : "code0", parentCode : "#", children : [] },{ code : "1", name : "code1", parentCode : "0", children : [] },{ code : "2", name : "code2", parentCode : "0", children : [] },{ code : "3", name : "code3", parentCode : "0", children : [] },{ code : "4", name : "code4", parentCode : "1", children : [] },{ code : "5", name : "code5", parentCode : "1", children : [] }];
// Doing it in a single loop (but note that Array#find
// is also a loop, so this is less efficient than using
// a mapping object
array.forEach(function(child) {
var parent = array.find(function(p) {
return p.code == child.parentCode;
});
if (parent) {
parent.children.push(child.code);
}
});
// Show result
console.log(array);
只是为了好玩,这里是 ES2015+ 中的映射版本(如果没有转译,将无法在旧浏览器上运行):
// The data
let array = [{ code : "0", name : "code0", parentCode : "#", children : [] },{ code : "1", name : "code1", parentCode : "0", children : [] },{ code : "2", name : "code2", parentCode : "0", children : [] },{ code : "3", name : "code3", parentCode : "0", children : [] },{ code : "4", name : "code4", parentCode : "1", children : [] },{ code : "5", name : "code5", parentCode : "1", children : [] }];
// Build a mapping object of parents keyed by their codes
let map = new Map();
array.forEach(entry => {
map.set(entry.code, entry);
});
// Push child codes into the parent `children` arrays
array.forEach(entry => {
if (entry.parentCode != "#") {
let parent = map.get(entry.parentCode);
if (parent) {
parent.children.push(entry.code);
}
}
});
// Show result
console.log(array);
如果你真的想变得晦涩难懂,你可以(滥用)使用 Array#reduce
来构建映射 object:
// Build a mapping object of parents keyed by their codes
let map = array.reduce((m, entry) => m.set(entry.code, entry), new Map());
我有一个像这样的 objects 数组:
var array = [{
code : "1",
name : "code1",
parentCode : "0",
children : []
},{
code : "0",
name : "code0",
parentCode : "#",
children : []
}]
如何将 parent 的代码推送到 parent 的 children
数组?理想情况下,推送后,array[1].children
应该是 ["1"]
我试过:
for (var i = 0; i<array.length;i++) {
var parentArray = array.find(function(a){
return a.parentCode == array[i].parentCode
});
parentArray.children.push(array[i].code);
}
结果是打乱的。 children 数组包含完全没有意义的条目组合(原本不属于那里的条目,因为它们的 parent 不同)
我应该换一种方式吗?
这是我想要完成的 before/after 的示例:
之前:
var array = [{
code : "0",
name : "code0",
parentCode : "#",
children : []
},{
code : "1",
name : "code1",
parentCode : "0",
children : []
},{
code : "2",
name : "code2",
parentCode : "0",
children : []
},{
code : "3",
name : "code3",
parentCode : "0",
children : []
},{
code : "4",
name : "code4",
parentCode : "1",
children : []
},{
code : "5",
name : "code5",
parentCode : "1",
children : []
}]
之后(期望的结果):
var array = [{
code : "0",
name : "code0",
parentCode : "#",
children : ["1","2","3"]
},{
code : "1",
name : "code1",
parentCode : "0",
children : ["4","5"]
},{
code : "2",
name : "code2",
parentCode : "0",
children : []
},{
code : "3",
name : "code3",
parentCode : "0",
children : []
},{
code : "4",
name : "code4",
parentCode : "1",
children : []
},{
code : "5",
name : "code5",
parentCode : "1",
children : []
}]
我可能会分两次执行此操作(但请参阅下文):
找到所有 parent 并通过代码构建对它们的引用映射
找到所有的children,将他们推到parents
像这样:
// The data
var array = [{ code : "0", name : "code0", parentCode : "#", children : [] },{ code : "1", name : "code1", parentCode : "0", children : [] },{ code : "2", name : "code2", parentCode : "0", children : [] },{ code : "3", name : "code3", parentCode : "0", children : [] },{ code : "4", name : "code4", parentCode : "1", children : [] },{ code : "5", name : "code5", parentCode : "1", children : [] }];
// Build a mapping object of parents keyed by their codes
var map = Object.create(null);
array.forEach(function(entry) {
map[entry.code] = entry;
});
// Push child codes into the parent `children` arrays
array.forEach(function(entry) {
if (entry.parentCode != "#") {
var parent = map[entry.parentCode];
if (parent) {
parent.children.push(entry.code);
}
}
});
// Show result
console.log(array);
分两次进行的原因是为了避免在 array
中进行不必要的搜索,寻找每个 parent。在 "mapping" object 中查找条目比在数组中查找条目更有效。
但如果您想一次性完成,您的 find
方法也可以。您尝试的问题是您将 parentCode
与 parentCode
进行比较(您应该将 child 的 parentCode
与 child 的 code
),并且您不允许找不到 parent(也许您确定它们将永远存在):
// The data
var array = [{ code : "0", name : "code0", parentCode : "#", children : [] },{ code : "1", name : "code1", parentCode : "0", children : [] },{ code : "2", name : "code2", parentCode : "0", children : [] },{ code : "3", name : "code3", parentCode : "0", children : [] },{ code : "4", name : "code4", parentCode : "1", children : [] },{ code : "5", name : "code5", parentCode : "1", children : [] }];
// Doing it in a single loop (but note that Array#find
// is also a loop, so this is less efficient than using
// a mapping object
array.forEach(function(child) {
var parent = array.find(function(p) {
return p.code == child.parentCode;
});
if (parent) {
parent.children.push(child.code);
}
});
// Show result
console.log(array);
只是为了好玩,这里是 ES2015+ 中的映射版本(如果没有转译,将无法在旧浏览器上运行):
// The data
let array = [{ code : "0", name : "code0", parentCode : "#", children : [] },{ code : "1", name : "code1", parentCode : "0", children : [] },{ code : "2", name : "code2", parentCode : "0", children : [] },{ code : "3", name : "code3", parentCode : "0", children : [] },{ code : "4", name : "code4", parentCode : "1", children : [] },{ code : "5", name : "code5", parentCode : "1", children : [] }];
// Build a mapping object of parents keyed by their codes
let map = new Map();
array.forEach(entry => {
map.set(entry.code, entry);
});
// Push child codes into the parent `children` arrays
array.forEach(entry => {
if (entry.parentCode != "#") {
let parent = map.get(entry.parentCode);
if (parent) {
parent.children.push(entry.code);
}
}
});
// Show result
console.log(array);
如果你真的想变得晦涩难懂,你可以(滥用)使用 Array#reduce
来构建映射 object:
// Build a mapping object of parents keyed by their codes
let map = array.reduce((m, entry) => m.set(entry.code, entry), new Map());