gpt4 book ai didi

JavaScript 对象 - 重新映射属性(按键)

转载 作者:行者123 更新时间:2023-11-29 20:11:26 25 4
gpt4 key购买 nike

你能想出一个更好的方法来重新映射这个 JavaScript 对象吗:

{
"id": 123,
"child.id": 456,
"child.child.id": 789
}

...进入这个 JavaScript 对象:

{
"id": 123,
"child": {
"id": 456,
"child": {
"id": 789
}
}
}

必须有更短或更快的解决方案。这是我的尝试:

var original = {
"id": 123,
"child.id": 456,
"child.child.id": 789
};

var result = {};

Object.keys(original).forEach(function(key) {
var node = result;
var keys = key.match(/(\w+)/g);

for (var i = 0; i < keys.length; i++) {
if (!node[keys[i]]) {
node[keys[i]] = {};
}
if (i == keys.length - 1) {
node[keys[i]] = original[key];
} else {
node = node[keys[i]];
}
}
});

最佳答案

我采用了您原来的方法,但使用了递归,它在我测试过的浏览器中似乎稍微快一些(除了 safari 和 opera,它们完全相等,不知道为什么是..):

function remapObject(original){
var result = {};
Object.keys(original).forEach(function(key) {
function splitNode(node, nodes){
var name = nodes.shift()
node[name] = (nodes.length >= 1)
? splitNode(node[name] || {}, nodes)
: original[key];
return node;
}
splitNode(result, key.split("."));
});
return result;
}

var original = {
"id": 123,
"child.id": 456,
"child.other": 789
},
result = remapObject(original)

console.log(original);
console.log(result);

fiddle 在这里:http://jsfiddle.net/hyperthalamus/3A9NQ/jsperf 测试在这里:http://jsperf.com/mapping-by-keys

编辑:在花了很多时间处理闭包和优化等之后,我最近(再次)不得不做一些与此非常相似的事情。下面是一个不依赖 Object.keys 或 array.forEach 的版本。 array.forEach 通常不利于性能和这两种方法 have limited browser support。下面的函数已针对重用进行了优化,因为此函数在我的应用程序初始化中用得相当多。我将其发布在这里(3 个月后),因为它特别适合我的需求,我想我会分享,即使这可能有点矫枉过正。

var remapObject = (function () {
"use strict";
var nodeSplit = function (key, original) {
return function splitNode(node, nodes) {
var name = nodes.shift();
node[name] = (nodes.length >= 1) ? splitNode(node[name] || {}, nodes) : original[key];
return node;
};
};
return function (original) {
var result = {},
prop,
splitNode;
for (prop in original) {
if (original.hasOwnProperty(prop)) {
nodeSplit(prop, original)(result, prop.split("."));
}
}
return result;
};
}());

顶部的函数在初始化外壳内创建一次并返回函数以避免在 for 循环内创建函数,因为这通常不利于优化,或者有人告诉我。

如果担心文件大小,这里有一个压缩版本:

var remapObject=function(){var h=function(a,b){return function g(d,e){var f=e.shift();d[f]=1<=e.length?g(d[f]||{},e):b[a];return d}};return function(a){var b={},c;for(c in a)a.hasOwnProperty(c)&&h(c,a)(b,c.split("."));return b}}();

关于JavaScript 对象 - 重新映射属性(按键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9546932/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com