2 回答

TA贡献1806条经验 获得超5个赞
我仍然在猜测你的输出格式。这是一个递归解决方案,给出了我在评论中询问的格式:
[
{name: "SuSPENSE"},
{name: "Subcontractor Expense", children: [
{name: "Data Entry"},
{name: "Design"},
{name: "Programming"},
{name: "Subcontractor Expense - Other"}
]},
{name: "Technology-Communication", children: [
//...
]}
]
const restructure = (
[s = undefined, ...ss],
index = s == undefined ? -1 : ss .indexOf ('Total ' + s)
) =>
s == undefined
? []
: index > -1
? [
{name: s, children: restructure (ss .slice (0, index))},
... restructure (ss .slice (index + 1))
]
: [{name: s}, ... restructure (ss)]
const data = ["SuSPENSE", "Subcontractor Expense", "Data Entry", "Design", "Programming", "Subcontractor Expense - Other", "Total Subcontractor Expense", "Technology-Communication", "Licenses", "Domain Hosting Fee", "Internet", "Internet Servers", "Internet - Other", "Total Internet", "Telephone", "Call Center", "Cellular Phones", "Fax", "Telephone - Other", "Total Telephone", "Hardware/Software", "Computer Software", "Hardware/Software - Other", "Total Hardware/Software", "Technology-Communication - Other", "Total Technology-Communication"]
console .log (
restructure (data)
)
.as-console-wrapper {min-height: 100% !important; top: 0}
请注意,在其中一个递归情况下,我们调用 main 函数两次。一次用于嵌套数据,一次用于数组的其余部分。
另一种可能的结构,一个我不太喜欢的结构,但可能满足您的需求,看起来像这样:
[
"SuSPENSE",
{"Subcontractor Expense": [
"Data Entry", "Design", "Programming", "Subcontractor Expense - Other"
]},
{ "Technology-Communication": [
// ...
]}
]
这可以通过一个小的修改来实现:
const restructure = (
[s = undefined, ...ss],
index = s == undefined ? -1 : ss .indexOf ('Total ' + s)
) =>
s == undefined
? []
: index > -1
? [
{[s]: restructure (ss .slice (0, index))},
... restructure (ss .slice (index + 1))
]
: [s, ... restructure (ss)]
更新
这个变体与第一个变体相同,但对于不习惯我的表达方式的人来说,可能看起来更熟悉:
const restructure = ([s = undefined, ...ss]) => {
if (s == undefined) {return []}
const index = ss .indexOf ('Total ' + s)
return index < 0
? [{name: s}, ... restructure (ss)]
: [
{name: s, children: restructure (ss .slice (0, index))},
... restructure (ss .slice (index + 1))
]
}

TA贡献1794条经验 获得超8个赞
您可以通过检查当前元素是否具有以单词开头,然后继续使用当前元素的文本的相应元素来执行此操作,如果是,则递增级别。当当前元素以单词总计开头时,您将递减级别。Total
const data = {"0":"SuSPENSE","1":"Subcontractor Expense","2":"Data Entry","3":"Design","4":"Programming","5":"Subcontractor Expense - Other","6":"Total Subcontractor Expense","7":"Technology-Communication","8":"Licenses","9":"Domain Hosting Fee","10":"Internet","11":"Internet Servers","12":"Internet - Other","13":"Total Internet","14":"Telephone","15":"Call Center","16":"Cellular Phones","17":"Fax","18":"Telephone - Other","19":"Total Telephone","20":"Hardware/Software","21":"Computer Software","22":"Hardware/Software - Other","23":"Total Hardware/Software","24":"Technology-Communication - Other","25":"Total Technology-Communication"}
function toNested(data) {
const result = [];
const levels = [result]
let level = 0;
const checkChildren = (string, data) => {
return data.some(e => e === `Total ${string}`)
}
data.forEach((e, i) => {
const object = { name: e, children: []}
levels[level + 1] = object.children;
if (e.startsWith('Total')) level--;
else levels[level].push(object);
if (checkChildren(e, data.slice(i))) level++;
})
return result;
}
const result = toNested(Object.values(data));
console.log(result)
添加回答
举报