JavaScript:对象重命名键
有一个聪明(即优化)的方式来重命名的JavaScript对象中的一个键?
一个非优化的方法是:
o[ new_key ] = o[ old_key ]; delete o[ old_key ];
我相信这样做的最完整(也是正确的)方式是:
if (old_key !== new_key) { Object.defineProperty(o, new_key, Object.getOwnPropertyDescriptor(o, old_key)); delete o[old_key]; }
此方法确保重命名属性的行为与原始行为相同 。
另外,在我看来,把这个包装成一个函数/方法并把它放到Object.prototype
与你的问题无关。
你可以将这个工作包装在一个函数中,并把它分配给Object
原型。 也许使用stream畅的界面风格来使多个重命名stream。
Object.prototype.renameProperty = function (oldName, newName) { // Do nothing if the names are the same if (oldName == newName) { return this; } // Check for the old property name to avoid a ReferenceError in strict mode. if (this.hasOwnProperty(oldName)) { this[newName] = this[oldName]; delete this[oldName]; } return this; };
ECMAScript 5具体
我希望语法不是这么复杂,但有更多的控制是绝对不错的。
Object.defineProperty( Object.prototype, 'renameProperty', { writable : false, // Cannot alter this property enumerable : false, // Will not show up in a for-in loop. configurable : false, // Cannot be deleted via the delete operator value : function (oldName, newName) { // Do nothing if the names are the same if (oldName == newName) { return this; } // Check for the old property name to // avoid a ReferenceError in strict mode. if (this.hasOwnProperty(oldName)) { this[newName] = this[oldName]; delete this[oldName]; } return this; } } );
就个人而言,重新命名对象中键的最有效的方法是不需要执行额外的重载插件和轮子:
var str = JSON.stringify(object); str = str.replace(/oldKey/g, 'newKey'); str = str.replace(/oldKey2/g, 'newKey2'); object = JSON.parse(str);
如果对象具有无效的结构,也可以将其封装在try-catch
。 完美的作品:)
我会做这样的事情:
function renameKeys(dict, keyMap) { return _.reduce(dict, function(newDict, val, oldKey) { var newKey = keyMap[oldKey] || oldKey newDict[newKey] = val return newDict }, {}) }
我想说,从概念的angular度来看,将旧的对象(从Web服务中的那个对象)保持原样,并把你需要的值放在一个新的对象中会更好。 我假设你正在提取特定的领域,无论如何,如果不是在客户端,那么至less在服务器上。 事实上,您select使用与Web服务相同的字段名称,只是小写,并没有真正改变这一点。 所以,我build议做这样的事情:
var myObj = { field1: theirObj.FIELD1, field2: theirObj.FIELD2, (etc) }
当然,我在这里做各种各样的假设,这可能不是真的。 如果这不适用于你,或者如果它太慢(是否?我没有testing,但我想像差异越来越小,随着字段数量的增加),请忽略所有这一切:)
如果你不想这样做,而且你只需要支持特定的浏览器,那么你也可以使用新的getter来返回“大写(字段)”:参见http://robertnyman.com/2009/05/28 / getters-and-setters-with-javascript-code-samples-and-demos /以及该页面上的链接以获取更多信息。
编辑:
令人难以置信的是,这也几乎是我工作的FF3.5的两倍。 请参阅: http : //jsperf.com/spiny001
如果有人需要重命名属性列表:
function renameKeys(obj, newKeys) { const keyValues = Object.keys(obj).map(key => { const newKey = newKeys[key] || key; return { [newKey]: obj[key] }; }); return Object.assign({}, ...keyValues); }
用法:
const obj = { a: "1", b: "2" }; const newKeys = { a: "A", c: "C" }; const renamedObj = renameKeys(obj, newKeys); console.log(renamedObj); // {A:"1", b:"2"}
虽然这并不能提供更好的解决方法来重命名密钥,但它提供了一种快捷方便的ES6方法来重命名对象中的所有密钥,同时不改变它们所包含的数据。
let b = {a: ["1"], b:["2"]}; Object.keys(b).map(id => { b[`root_${id}`] = [...b[id]]; delete b[id]; }); console.log(b);
我想只使用ES6(ES2015)
方式!
我们需要跟上时代!
const old_obj = { k1: `111`, k2: `222`, k3: `333` }; console.log(`old_obj =\n`, old_obj); // {k1: "111", k2: "222", k3: "333"} /** * @description ES6 ...spread & Destructuring Assignment */ const {k1: kA, k2: kB, k3: kC,} = {...old_obj} console.log(`kA = ${kA},`, `kB = ${kB},`, `kC = ${kC}\n`); // kA = 111, kB = 222, kC = 333 const new_obj = Object.assign( {}, { kA, kB, kC } ); console.log(`new_obj =\n`, new_obj); // {kA: "111", kB: "222", kC: "333"}