originalTree.map()
循环的方法,还将您的children.filter().map()
链简化为children.flatMap()
调用:我从对象数组和对象数组中两次更改了一个对象,因此在第一次迭代中,我滤除了一些对象,而在第二次迭代中,我使用map更改了每个滤过的对象。我可以使用减速器或更好的东西吗?
const originalTree = html.parse(text);
if (originalTree[0].type === 'text') {
return text;
}
const result = originalTree
.map((obj) => ({
...obj,
children: obj.children.filter((el) => el.name !== 'style'),
}))
.map((obj) => ({
...obj,
children: obj.children.map(function(child) {
child.attrs = {};
return child;
}),
}));
return html.stringify(result);
}
DISCLAIMER:以下解决方案的唯一原理是对OP现有的代码库进行最小的更改,这表明在使用高阶方法遍历整个数组时,您可能会产生必要的副作用(where不会损害代码的其余部分]])。
但是,重要的是要注意
,在减少必要的循环周期的同时,下面的代码对原始对象进行了变异[targets]时不可接受 。.filter()
遍历整个数组,因此您可以在此过程中修改必要的项目:const result = originalTree
.map((obj) => ({
...obj,
children: obj.children.filter((el) => el.name !== 'style' ? (el.attrs = {}, true) : false),
}))
您可以在下面找到快速演示:const originalTree = [ { type: 'tag', name: 'p', children: [ {type: 'tag', name: 'style'}, {type: 'tag', name: 'text'}, ] }, { type: 'tag', name: 'div', children: [ {type: 'tag', name: 'text'}, {type: 'tag', name: 'span'}, {type: 'tag', name: 'style'} ] } ], result = originalTree .map((obj) => ({ ...obj, children: obj.children.filter((el) => el.name !== 'style' ? (el.attrs = {}, true) : false), })) console.log(result)
.as-console-wrapper {min-height:100%}
children.flatMap()
[如果您想继续在const result = originalTree.map( obj => ({ ...obj, children: obj.children.flatMap( el => el.name !== 'style' ? [{ ...el, attrs: {} }] : [] ) }) );
上分别使用filter()
和map()
,我建议至少不变地添加obj.children
,而不是修改现有的引用:
attrs