【问题标题】:Fastest possible object remapping for nested structure嵌套结构的最快对象重映射
【发布时间】:2020-06-16 02:33:48
【问题描述】:

假设我们有来自两个不同 API 的两个不同结构。每个都有不同的架构。

我们将此作为 API #1 的返回

[
    {
        Id: "test1",
        Title: "label 1",
        Children: [
            {
                Id: "test2",
                Title: "label 2",
                Children: [
                    {
                        Id: "test3",
                        Title: "label 3"
                    }
                ]
            }
        ]
    }
]

我需要将其转换为以下方案:

[
    {
        value: "test1",
        label: "label 1",
        children: [
            {
                value: "test2",
                label: "label 2",
                children: [
                    {
                        value: "test3",
                        label: "label 3"
                    }
                ]
            }
        ]
    }
]

到目前为止,我已经想出了这个方法:

const transformItem = ({ Id, Title, Children }) => ({
  value: Id,
  label: Title,
  children: Children ? transformData(Children) : null
});

const transformData = arr => arr.map(item => transformItem(item));

// Process data
const DataForApi2 = transformData(DataFromApi1);

从我执行的有限基准测试和我所知道的情况来看,在 V8(占我们用户群的 95% 以上)中,这看起来足够快,因为我没有改变任何数据结构(因此热对象是完整的并保持性能) 并使用范围内的所有内容,这样我就不会浪费内存。似乎具有线性复杂性,如果每个客户端加载应用程序仅执行一次(仅在登录后的第一次),也不会太糟糕。

【问题讨论】:

  • 社区似乎更喜欢在codereview.stackexchange.com 上提出此类问题,但当然,请先阅读他们的帮助,以确保您按照该网站的规则正确呈现。
  • 一个长镜头,但因为你的结构大部分是相同的,只有键在改变,也许字符串化对象并执行字符串全局查找替换它可能会更快。不过不确定。
  • FWIW,你的分析对我来说似乎不错。 如果原始数据是短暂的并且API忽略了它不使用的属性,你可以只修改现有的对象,要么保留旧的道具,要么写@987654325 @ 给他们。 V8 在这方面非常快。但这两个前提条件都必须为真。
  • @Zenkylo - 由于值是字符串,您必须注意字符串中的属性名称,这会变得混乱且难以维护快速。 :-) (我也相当确定通过 JSON 进行往返会比 OP 所拥有的要慢,因为它仍然涉及创建新对象,但分支更多。)
  • const transformData = arr => arr.map(transformItem);

标签: javascript performance ecmascript-6 javascript-objects


【解决方案1】:

就运行时间而言,您是对的,这可能是我们使用O(n) 可以获得的最快速度。

您可以通过将解决方案从递归转换为迭代来提高空间复杂度。它saves space on the callstack 在树木非常深的极端情况下会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-27
    • 2013-08-01
    • 1970-01-01
    • 2017-07-20
    • 2018-03-17
    • 2016-12-12
    • 1970-01-01
    相关资源
    最近更新 更多