【发布时间】: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