我想将属性添加到JS对象,但是在自定义位置,在给定属性之后。
me
有没有办法在其中指定对象(age
),属性(newAt
)并在指定的属性之后添加新属性(var newMe = {
name: "myname",
age: "myage",
newAt: "newAttr",
bday: "mybday"
}
)?比做字符串操作更好的方法?
system.actorOf
更新 :(因为人们更关注我为什么要问这个而不是实际回答它) 我正在研究一个基于用户输入的可绘制组件 - 这是一个JS对象。并且它具有编辑它的能力 - 所以当用户在点击的节点上添加基于“添加新节点”的新属性时,我正在考虑在它之后添加新节点。我想相应地更新数据。
答案 0 :(得分:3)
JavaScript对象是无序属性列表。订单未定义,并且在使用for in
之类的迭代器时可能会有所不同。您不应该根据在调试器或控制台中看到的属性顺序来构建代码。
答案 1 :(得分:3)
自ES2015起,JavaScript对象执行对其属性有一个订单,但该订单仅保证由某些操作(Object.getOwnPropertyNames
,Reflect.ownKeys
使用,因特殊原因,特别是不 for-in
或Object.keys
。 See this answer了解详情。
但你不应该依赖这个顺序,没有意义,它比最初看起来更复杂,并且很难操作(你基本上必须创建一个新对象来设置其属性的顺序)。如果您想订购,请使用数组。
重新编辑:
我正在研究一个基于用户输入的可绘制组件 - 这是一个JS对象。并且它具有编辑它的能力 - 所以当用户在点击的节点上添加基于“添加新节点”的新属性时,我正在考虑在它之后添加新节点。我想相应地更新数据。
最好的方法是,如果你想要一个特定的订单,保持一个数组中的键的顺序,并使用它来显示该对象。
虽然 可以使用ES2015的属性订单,但您必须这样做:
这比将数组保存在数组中要多得多,而且要脆弱得多。
答案 2 :(得分:0)
我能找到的最简单的解决方案是遍历父级的密钥并继续推送它们以形成父级的克隆。但是如果满足触发键,则另外推送新对象。
var myObj = {
child1: "data1",
child2: "data2",
child3: "data3",
child4: "data4"
};
var a = (function addAfterChild(data, trigChild, newAttribute, newValue) {
var newObj = {};
Object.keys(data).some(function(k) {
newObj[k] = data[k];
if (k === trigChild) {
newObj[newAttribute] = newValue;
}
});
return newObj;
})(myObj, "child3", "CHILD", "VALUE");
document.getElementById("result").innerHTML = JSON.stringify(a);
<p id="result"></p>