44

私は持っている

var obj = {'b': 2, 'c': 3};

そして、そのオブジェクトの最初 (最後ではなく) にプロパティを追加したいと思います:

var obj = {'a': 1, 'b': 2, 'c': 3};

それを行うためのきれいな方法はありますか?

4

8 に答える 8

75

ES6 (ES2015+) でObject.assign()を使用することもできます。

let obj = {'b': 2, 'c': 3};
const returnedTarget = Object.assign({a: 1}, obj);

// Object {a: 1, b: 2, c: 3}
于 2017-03-23T00:05:02.897 に答える
18

最も簡単な方法は、スプレッド演算子を使用することです。

let obj = {'b': 2, 'c': 3};
let newObj = {'a': 1, ...obj};
于 2018-11-02T05:44:06.247 に答える
13

JavaScript オブジェクトは順不同です。始まりも終わりもありません。順序が必要な場合は、配列を使用してください。

var arr = [
    { key: 'b', value: 2 },
    { key: 'c', value: 3 }
];

次に、次のように前に追加できますunshift

arr.unshift({ key: 'a', value: 1 });
于 2013-10-18T19:11:48.047 に答える
5

これは、次のように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' 関数は完全に新しいオブジェクトを生成することに注意してください。渡されたオブジェクトはどちらも変更されません。

于 2014-09-24T23:24:24.167 に答える
2

Javascript は、言語自体でプロパティの順序を指定しない場合がありますが、少なくとも私のプロジェクト (およびおそらくあなたのプロジェクト) では、指定したかのように動作します ( JSON.stringify、デバッグ ウォッチ ウィンドウなど)。for...inプロパティが最初に追加された順序以外の順序になっているのを見たことがありません。したがって、私のプロジェクトのすべての意図と目的、およびおそらくあなたのプロジェクトのすべての意図と目的について、これは非常に予測可能です.

これは実行には影響しませんが、オブジェクトの作成方法に応じて異なるアイテムのプロパティが異なる順序で追加される可能性がある場合に、統一されたリストを表示したい場合は面倒です。プロジェクト開発において重要なのは実行だけではないかもしれません。オブジェクトを視覚的にすばやく検査できることも重要です。

方法 1 (ハイテク)

をお持ち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}

ノート

  • any を使用しindexて、必要な場所にプロパティを配置できます。0 は前面に配置します。
  • にメソッドを追加したくない場合は、確かに関数を引き出して obj パラメータを追加できますobject prototype。私のプロジェクトでは、プロトタイプにメソッドを追加すると役に立ちます。それは私を傷つけません。

方法 2 (ローテク)

場合によっては、最終的に表示される順序で表示される可能性があることがわかっているすべてのプロパティを使用してオブジェクトを作成し、後でプロパティを挿入する代わりに、プロパティを設定するだけでよい場合があります。

// creation
var a = {Id: null, foo: 'bar'}; 

// update later
if(!a.Id)
  a.Id = '123'; 
于 2020-02-24T20:42:04.530 に答える
1

私にとってうまくいったのは、アイテムを目的の順序で格納するために一時オブジェクトを使用することです。例えば:

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
于 2016-09-15T22:57:02.197 に答える