私は持っている
var obj = {'b': 2, 'c': 3};
そして、そのオブジェクトの最初 (最後ではなく) にプロパティを追加したいと思います:
var obj = {'a': 1, 'b': 2, 'c': 3};
それを行うためのきれいな方法はありますか?
私は持っている
var obj = {'b': 2, 'c': 3};
そして、そのオブジェクトの最初 (最後ではなく) にプロパティを追加したいと思います:
var obj = {'a': 1, 'b': 2, 'c': 3};
それを行うためのきれいな方法はありますか?
ES6 (ES2015+) でObject.assign()を使用することもできます。
let obj = {'b': 2, 'c': 3};
const returnedTarget = Object.assign({a: 1}, obj);
// Object {a: 1, b: 2, c: 3}
最も簡単な方法は、スプレッド演算子を使用することです。
let obj = {'b': 2, 'c': 3};
let newObj = {'a': 1, ...obj};
JavaScript オブジェクトは順不同です。始まりも終わりもありません。順序が必要な場合は、配列を使用してください。
var arr = [
{ key: 'b', value: 2 },
{ key: 'c', value: 3 }
];
次に、次のように前に追加できますunshift
。
arr.unshift({ key: 'a', value: 1 });
これは、次のようにlodashマージ関数を使用して実行できます。
var myObj = _.merge({ col1: 'col 1', col2: 'col 2'}, { col3: 'col 3', col4: 'col 4' });
最終的なオブジェクトは次のようになります。
{ col1: 'col 1', col2: 'col 2', col3: 'col 3', col4: 'col 4' }
他の人が述べたように、オブジェクトの操作によっては、オブジェクト内のキーの順序が同じままであるという保証はありません。ただし、最後のステップとしてマージを実行する場合は、問題ありません。'merge' 関数は完全に新しいオブジェクトを生成することに注意してください。渡されたオブジェクトはどちらも変更されません。
Javascript は、言語自体でプロパティの順序を指定しない場合がありますが、少なくとも私のプロジェクト (およびおそらくあなたのプロジェクト) では、指定したかのように動作します ( JSON.stringify
、デバッグ ウォッチ ウィンドウなど)。for...in
プロパティが最初に追加された順序以外の順序になっているのを見たことがありません。したがって、私のプロジェクトのすべての意図と目的、およびおそらくあなたのプロジェクトのすべての意図と目的について、これは非常に予測可能です.
これは実行には影響しませんが、オブジェクトの作成方法に応じて異なるアイテムのプロパティが異なる順序で追加される可能性がある場合に、統一されたリストを表示したい場合は面倒です。プロジェクト開発において重要なのは実行だけではないかもしれません。オブジェクトを視覚的にすばやく検査できることも重要です。
をお持ちspread
の場合、別のオブジェクトを気にしない場合はそれを使用します。spread
しかし、 (古い Google Apps スクリプトのように)持っていない場合、または元の object を保持する必要がある場合は、次のようにすることができます。
objects.js
// Insert Property
Object.defineProperty(
Object.prototype,
'insertProperty',
{
value: function(name, value, index){
// backup my properties
var backup = {};
// delete all properties after index
var propertyIndex = 0;
for(var propertyName in this) {
if(this.hasOwnProperty(propertyName) && propertyIndex++ >= index) {
backup[propertyName] = this[propertyName];
delete this[propertyName];
}
}
this[name] = value;
// restore all properties after index
for(var propertyName in backup) {
if(backup.hasOwnProperty(propertyName))
this[propertyName] = backup[propertyName];
}
return this; // same object; not a new object
},
enumerable: false,
});
利用方法
var obj = {'b': 2, 'c': 3};
obj.insertProperty('a',1,0); // {a:1, b:2, c:3}
ノート
index
て、必要な場所にプロパティを配置できます。0 は前面に配置します。object prototype
。私のプロジェクトでは、プロトタイプにメソッドを追加すると役に立ちます。それは私を傷つけません。場合によっては、最終的に表示される順序で表示される可能性があることがわかっているすべてのプロパティを使用してオブジェクトを作成し、後でプロパティを挿入する代わりに、プロパティを設定するだけでよい場合があります。
// creation
var a = {Id: null, foo: 'bar'};
// update later
if(!a.Id)
a.Id = '123';
私にとってうまくいったのは、アイテムを目的の順序で格納するために一時オブジェクトを使用することです。例えば:
var new_object = {};
new_object[name] = value; // The property we need at the start
for (var key in old_object) { // Looping through all values of the old object
new_object[key] = old_object[key];
delete old_object[key];
}
old_object = new_object; // Replacing the old object with the desired one