首页 > 解决方案 > 将名称之间带点的数组映射到嵌套字段

问题描述

我正在尝试转换名称之间带有点的字符串数组。我想制作一个像 in 一样的对象数组const out。我试图通过reduceRight来实现,但我不知道如何组合字段。

我的代码:

const input = ['apples', 'bananas.kivi.grape', 'bananas.orange', 'bananas.strawberry'];
const res = input.map((item) => {
  const splInp = item.split('.');
  return splInp.reduceRight((acc, item) => {
    if (Object.keys(acc).length !== 0) {
      return {
        children: [acc],
        "name": item
      };
    } else {
      return {
        "name": item
      };
    }
  }, []/* as any*/);
});
console.log(res);

期望的输出:

const out = [
  { name: 'apples' },
  {
    name: 'bananas',
    children: [
      {
        name: 'kivi',
        children: [
          {
            name: 'grape',
          },
        ],
      },
      { name: 'orange' },
      { name: 'strawberry' },
    ],
  },
];

标签: javascriptarraysstringperformance

解决方案


您可以使用trie解决它

每当你得到一个字符串时,只需遍历你的树并最终添加任何叶子(如果你不能遍历更多)

const input = ['apples', 'bananas.kivi.grape', 'bananas.orange', 'bananas.strawberry', 'apples.are.good', 'apples.are.not.good'];
const Trie = () => {
  const root = {}
  const add = s => {
    s.split('.').reduce((acc, tok) => {
      if (!acc[tok]) {
        // add the leaf
        acc[tok] = { children: {} }
      }
      // traverse the node
      return acc[tok].children
    }, root)
  }
  const toJSON = (node = root) => {
    return Object.entries(node).map(([name, { children }]) => ({
      name, children: toJSON(children)
    }))
  }
  return { add, toJSON }
}
const t = Trie()
input.forEach(t.add)
console.log(JSON.stringify(t.toJSON(), null, 2))


推荐阅读