[英]Javascript: how to dynamically create nested objects using object names given by an array
[英]JavaScript - How to dynamically create a nested array of objects?
我提供了一个字符串B1-FEOL-SPUTTER-0015
,该字符串将由-
(破折号)分割,然后用于构建嵌套的对象数组。 这是原始树:
[{
"text": "B1",
"nodes": [{
"text": "FEOL",
"nodes": [{
"text": "SPUTTER"
}, {
"text": "COATING"
}, {
"text": "EXPOSING"
}, {
"text": "DEVELOP"
}, {
"text": "PLATING"
}, {
"text": "BOND"
}]
}, {
"text": "BEOL",
"nodes": [{
"text": "GRINDING"
}, {
"text": "BALLDROP"
}, {
"text": "PROBING"
}, {
"text": "BACKCOATING"
}, {
"text": "MARKING"
}, {
"text": "SORTING"
}, {
"text": "TUG"
}]
}]
}, {
"text": "B2",
"nodes": [{
"text": "FEOL",
"nodes": [{
"text": "SPUTTER"
}, {
"text": "COATING"
}, {
"text": "EXPOSING"
}, {
"text": "DEVELOP"
}, {
"text": "PLATING"
}, {
"text": "BOND"
}]
}, {
"text": "BEOL",
"nodes": [{
"text": "GRINDING"
}, {
"text": "BALLDROP"
}, {
"text": "PROBING"
}, {
"text": "BACKCOATING"
}, {
"text": "MARKING"
}, {
"text": "SORTING"
}, {
"text": "TUG"
}]
}]
}]
我尝试通过将新值输入.forEach(manipulateTree)
来使用递归函数。 但是我不能在else
语句中完成在数组中创建新节点的工作。
import fs from 'fs'
import path from 'path'
import util from 'util'
// This is avaliable in the link below, leading to pastebin
let tree = require('./server/configs/tree.json')
// The values I used to test:
// This works
// const newBranch = 'B1-FEOL-SPUTTER-0015'
// This doesn't
const newBranch = 'B3-ASDF-DSDF987SDF7-0015'
const locations = newBranch.split('-')
let nodes = {}
let iteration = -1
const manipulateTree = branch => {
iteration++
// Found node
if (branch.text === locations[iteration]) {
// Check if the iteration is second last in the branch array
if (iteration === locations.length - 2) {
branch.nodes.push({
'text': locations[iteration + 1],
'location': locations.join('-')
})
} else {
// If not then the recursive function will continue operation
if (branch.nodes && branch.nodes.length > 0) {
const found = branch.nodes.find(node => node.text === locations[iteration + 1])
if (found) {
branch.nodes.forEach(manipulateTree)
}
}
}
} else {
console.log('No such node')
if (iteration === locations.length - 1) {
branch = {
'text': locations[iteration],
'location': locations.join('-')
}
} else {
branch = {
'text': locations[iteration],
'nodes': []
}
}
}
return branch
}
if (tree && tree.length > 0) {
tree.forEach(manipulateTree)
}
console.log(util.inspect(tree, false, null, true))
我想要的最终结果是:
[{
"text": "B1",
"nodes": [{
"text": "FEOL",
"nodes": [{
"text": "SPUTTER"
}, {
"text": "COATING"
}, {
"text": "EXPOSING"
}, {
"text": "DEVELOP"
}, {
"text": "PLATING"
}, {
"text": "BOND"
}]
}, {
"text": "BEOL",
"nodes": [{
"text": "GRINDING"
}, {
"text": "BALLDROP"
}, {
"text": "PROBING"
}, {
"text": "BACKCOATING"
}, {
"text": "MARKING"
}, {
"text": "SORTING"
}, {
"text": "TUG"
}]
}]
}, {
"text": "B2",
"nodes": [{
"text": "FEOL",
"nodes": [{
"text": "SPUTTER"
}, {
"text": "COATING"
}, {
"text": "EXPOSING"
}, {
"text": "DEVELOP"
}, {
"text": "PLATING"
}, {
"text": "BOND"
}]
}, {
"text": "BEOL",
"nodes": [{
"text": "GRINDING"
}, {
"text": "BALLDROP"
}, {
"text": "PROBING"
}, {
"text": "BACKCOATING"
}, {
"text": "MARKING"
}, {
"text": "SORTING"
}, {
"text": "TUG"
}]
}]
}, { // This hear is the end result I want if there is no such node from the original tree
"text": "B3",
"nodes": [{
"text": "ASDF",
"nodes": [{
"text": "DSDF987SDF7",
"nodes": [{
"text": "0015",
"location": "B3-ASDF-DSDF987SDF7-0015"
}]
}]
}]
}]
给定树结构和路径,您只需要迭代路径并跟踪您的位置。 如果您遇到的地方不存在,请添加并继续。 您可以跟踪索引,以便知道何时击中最后一项,并应添加location
而不是nodes
数组:
let tree = [{"text": "B1","nodes": [{"text": "FEOL","nodes": [{"text": "SPUTTER"}, {"text": "COATING"}, {"text": "EXPOSING"}, {"text": "DEVELOP"}, {"text": "PLATING"}, {"text": "BOND"}]}, {"text": "BEOL","nodes": [{"text": "GRINDING"}, {"text": "BALLDROP"}, {"text": "PROBING"}, {"text": "BACKCOATING"}, {"text": "MARKING"}, {"text": "SORTING"}, {"text": "TUG"}]}]}, {"text": "B2","nodes": [{"text": "FEOL","nodes": [{"text": "SPUTTER"}, {"text": "COATING"}, {"text": "EXPOSING"}, {"text": "DEVELOP"}, {"text": "PLATING"}, {"text": "BOND"}]}, {"text": "BEOL","nodes": [{"text": "GRINDING"}, {"text": "BALLDROP"}, {"text": "PROBING"}, {"text": "BACKCOATING"}, {"text": "MARKING"}, {"text": "SORTING"}, {"text": "TUG"}]}]}] const newBranch = 'B3-ASDF-DSDF987SDF7-0015' let components = newBranch.split('-') let nodes = tree // nodes is the current array components.forEach((text, i) => { let current = nodes.find(i => i.text == text ) // find matching item if (!current) { current = i == components.length - 1 // if no matching item add it ? {text, location: newBranch } : {text, nodes:[] } nodes.push(current) } else if (!current.nodes) current.nodes = [] nodes = current.nodes }) console.log(tree)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.