我试图在彼此之间嵌套元素,但是今天我却放屁了。
如果数组中的元素为isParent:true,则它将在exist数组中创建一个新数组,并且所有后续元素都将嵌套在该数组中。
这是我到目前为止尝试过的:
//input [{},{},{},{isParent}, {}, {}, {isParent}, {}, {}]
//desired output [{}, {}, {}, [{}, {}, {}, [{}, {}, {}]]]
var nestInParent = elements => {
let ignoreIndexAfter = null;
return elements.reduce((acc, { component, isParent }, index) => {
if (isParent) {
let remaining = elements.slice(index + 1);
ignoreIndexAfter = index;
if (remaining.length > 0) {
return [...acc, [component, ...nestInParent(remaining)]];
} else {
return [...acc, [component]];
}
} else {
if(ignoreIndexAfter === null || index < ignoreIndexAfter){
return [...acc, component];
}
return acc;
}
}, []);
};
const isParent = true;
const input = [
{component:0},
{component:1},
{component:2},
{isParent, component:3},
{component:4},
{component:5},
{isParent, component:6},
{component:7},
{component:8}
];
const expected = [
0,
1,
2,
[
3,
4,
5,
[
6,
7,
8
]
]
];
const output = nestInParent(input);
console.log("input:", input);
console.log("output:", output);
console.log("passes?", JSON.stringify(output) === JSON.stringify(expected));
.as-console-wrapper { max-height: 100% !important; }
答案 0 :(得分:2)
您还可以使用reduce
方法和一个变量来跟踪是否找到具有isParent
属性的元素。
const isParent = true;
const input = [{component:0},{component:1},{component:2},{isParent, component:3},{component:4},{component:5},{isParent, component:6},{component:7},{component:8}];
function nest(data) {
let nested = false;
return data.reduce((r, e, i) => {
if(!nested) {
if(e.isParent) {
const res = nest(data.slice(i + 1))
r.push([e.component, ...res])
nested = true;
} else {
r.push(e.component)
}
}
return r;
}, [])
}
const result = nest(input);
console.log(result)
您也可以这样写。
const isParent = true;
const input = [{ component: 0 }, { component: 1 }, { component: 2 }, { isParent, component: 3 }, { component: 4 }, { component: 5 },{ isParent, component: 6 }, { component: 7 }, { component: 8 }];
function nest(data, nested) {
return data.reduce((r, e, i) => {
if(!nested) {
if(e.isParent && i != 0) {
r.push(nest(data.slice(i)))
nested = true;
} else {
r.push(e.component)
}
}
return r;
}, [])
}
const result = nest(input);
console.log(result)
答案 1 :(得分:2)
我会说您的代码失败,因为它过于复杂。您只需要:
const result = [];
let current = result;
for(const { component, isParent } of data) {
if(isParent) {
current.push(current = [component]);
} else current.push(component);
}
const input = [
{component:0},
{component:1},
{component:2},
{isParent: true, component:3},
{component:4},
{component:5},
{isParent: true, component:6},
{component:7},
{component:8}
];
const result = [];
let current = result;
for(const { component, isParent } of input) {
if(isParent) {
current.push(current = [component]);
} else current.push(component);
}
console.log(result);
或者,如果您确实要减少,请减少right:
const result = data.reduceRight((acc, { isParent, component }) => isParent ? [[component, ...acc]] : [component, ...acc], []);
const input = [
{component:0},
{component:1},
{component:2},
{isParent: true, component:3},
{component:4},
{component:5},
{isParent: true, component:6},
{component:7},
{component:8}
];
const result = input.reduceRight((acc, { isParent, component }) =>
isParent ? [[component, ...acc]] : [component, ...acc], []);
console.log(result);