是否可以减少而不是过滤和映射? [重复]

问题描述 投票:1回答:2

我从对象数组和对象数组中两次更改了一个对象,因此在第一次迭代中,我滤除了一些对象,而在第二次迭代中,我使用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);
}
javascript reactjs ecmascript-6 reducers
2个回答
2
投票

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%}
这是一种与一个originalTree.map()循环的方法,还将您的children.filter().map()链简化为children.flatMap()调用:

children.flatMap()

[如果您想继续在const result = originalTree.map(
  obj => ({
    ...obj,
    children: obj.children.flatMap(
      el => el.name !== 'style'
        ? [{ ...el, attrs: {} }]
        : []
    )
  })
);
上分别使用filter()map(),我建议至少不变地添加obj.children,而不是修改现有的引用:

attrs


4
投票
这是一种与一个originalTree.map()循环的方法,还将您的children.filter().map()链简化为children.flatMap()调用:
© www.soinside.com 2019 - 2024. All rights reserved.