JavaScriptオブジェクトにキーと値のペアを追加するにはどうすればよいですか?


1383

これが私のオブジェクトリテラルです:

var obj = {key1: value1, key2: value2};

どのように私は、フィールドを追加することができますkey3value3、オブジェクトに?


2
さて、あなたがこれを行うことができますので、JSで連想配列の全体の問題は、奇妙である... dreaminginjavascript.wordpress.com/2008/06/27/...
Nosredna

@Nosredna-重要なのは、JavaScriptには連想配列などはないということです。その記事では、配列オブジェクトにオブジェクトプロパティを追加していますが、これらは実際には「配列」の一部ではありません。
UpTheCreek 2012

将来のES +実装でオブジェクトリテラルにキーと値のペアを条件付きで設定する方法はありますか?
Con Antonakos 16

回答:


2253

オブジェクトに新しいプロパティを追加するには、2つの方法があります。

var obj = {
    key1: value1,
    key2: value2
};

ドット表記の使用:

obj.key3 = "value3";

角括弧表記を使用:

obj["key3"] = "value3";

最初のフォームは、プロパティの名前がわかっている場合に使用されます。2番目の形式は、プロパティの名前が動的に決定されるときに使用されます。この例のように:

var getProperty = function (propertyName) {
    return obj[propertyName];
};

getProperty("key1");
getProperty("key2");
getProperty("key3");

リアル JavaScriptの配列は、いずれかを使用して構築することができます。

配列リテラル表記:

var arr = [];

Arrayコンストラクター表記:

var arr = new Array();

4
objはオブジェクトです。ブレースの間(およびブレースを含む)の部分がオブジェクトリテラルです。objはオブジェクトリテラルではありません。
Nosredna 2009

24
キーが数字の場合はどうなりますか?obj.123 = 456は機能しません。obj [123] = 456でも機能します
axel freudiger '11

10
@axelfreudigerは確かに、構文的に有効な変数識別子ではないものはすべて、ブラケット表記で使用する必要があります。
Ionuț G. Stan

1
@KyleKhalafObject.keys({"b": 1, "c": 3, "a": 2}).sort().forEach(console.log);
Ionuț G. Stan

2
@JohnSmith lengthプロパティは配列ではないため設定されていません。オブジェクト/マップ/辞書です。
Ionuț G. Stan 2018

348

2017年の回答: Object.assign()

Object.assign(dest、src1、src2、...)はオブジェクトをマージします。

destソースオブジェクトのプロパティと値(ただし、多数)で上書きし、を返しますdest

このObject.assign()メソッドは、列挙可能なすべての独自のプロパティの値を1つ以上のソースオブジェクトからターゲットオブジェクトにコピーするために使用されます。ターゲットオブジェクトを返します。

実例

var obj = {key1: "value1", key2: "value2"};
Object.assign(obj, {key3: "value3"});

document.body.innerHTML = JSON.stringify(obj);

2018年の回答:オブジェクト拡散演算子 {...}

obj = {...obj, ...pair};

MDNから:

提供されたオブジェクトから新しいオブジェクトに独自の列挙可能なプロパティをコピーします。

シャロークローニング(プロトタイプを除く)またはオブジェクトのマージが、より短い構文を使用して可能になりました Object.assign()

は、setterObject.assign()トリガーしますが、spread構文はトリガーしません。

実例

現在のChromeとFirefoxで動作します。彼らはそれが現在のエッジでは機能しないと言います。

var obj = {key1: "value1", key2: "value2"};
var pair = {key3: "value3"};
obj = {...obj, ...pair};

document.body.innerHTML = JSON.stringify(obj);

2019年の回答

オブジェクト割り当て演算子 +=

obj += {key3: "value3"};

おっと...私は夢中になりました。未来からの密輸情報は違法です。完全に覆い隠された!


34
obj + =は素晴らしい音
Mehrdad Shokri

2
phpstormはconst、のlet代わりにを使用することをお勧めしvarます、それは2018年の方法ですか?
ジムスミス2018年

@jimsmith:なぜここでこれを言っているのかわからない。私の意見が欲しいですか?インタープリターの利点は、コンソールにあるすべてのものを変更できることです。constそれはその利点を取り除くので、私は好きではありません。使うたびに開発の妨げになりました。
7vujy0f0hy

私たちは2019年にいますが、それは割り当て演算子をスプレッド演算子の代わりにすでに使用できることを意味しますか?
Mr-Programs

2
真のプログラマーは、これまでにストレスの多い職業に救済を提供するためにいくつかの楽しみを大切にします。あなたのYear 2019 answer ... Opps ...部分はありがとうに値します、あなたは私の日を作りました。ベストアンサー+1
ColinWa

89

より大きなプロジェクトを書くとき、LoDash / Underscoreが好きになりました。

追加obj['key']またはobj.keyすべては、JavaScriptの純粋な答えです。ただし、LoDashライブラリとUnderscoreライブラリはどちらも、一般的にオブジェクトと配列を操作するときに多くの便利な関数を提供します。

.push()オブジェクトではなく配列です

探しているものに応じて、2つの特定の機能を使用すると便利で、の感覚に似た機能を提供できますarr.push()。詳細については、ドキュメントをチェックしてください、彼らはそこにいくつかの素晴らしい例を持っています。

_.merge(Lodashのみ)

2番目のオブジェクトは、基本オブジェクトを上書きまたは追加します。 undefined値はコピーされません。

var obj = {key1: "value1", key2: "value2"};
var obj2 = {key2:"value4", key3: "value3", key4: undefined};
_.merge(obj, obj2);
console.log(obj);
// → {key1: "value1", key2: "value4", key3: "value3"} 

_.extend / _.assign

2番目のオブジェクトは、基本オブジェクトを上書きまたは追加します。 undefinedコピーされます。

var obj = {key1: "value1", key2: "value2"};
var obj2 = {key2:"value4", key3: "value3", key4: undefined};
_.extend(obj, obj2);
console.log(obj);
// → {key1: "value1", key2: "value4", key3: "value3", key4: undefined}

_.defaults

2番目のオブジェクトには、ベースオブジェクトが存在しない場合にベースオブジェクトに追加されるデフォルトが含まれています。 undefinedキーがすでに存在する場合、値がコピーされます。

var obj = {key3: "value3", key5: "value5"};
var obj2 = {key1: "value1", key2:"value2", key3: "valueDefault", key4: "valueDefault", key5: undefined};
_.defaults(obj, obj2);
console.log(obj);
// → {key3: "value3", key5: "value5", key1: "value1", key2: "value2", key4: "valueDefault"}

$ .extend

さらに、jQuery.extendについて言及することは価値があるかもしれません。これは_.mergeと同様に機能し、すでにjQueryを使用している場合はより良いオプションとなる可能性があります。

2番目のオブジェクトは、基本オブジェクトを上書きまたは追加します。 undefined値はコピーされません。

var obj = {key1: "value1", key2: "value2"};
var obj2 = {key2:"value4", key3: "value3", key4: undefined};
$.extend(obj, obj2); 
console.log(obj);
// → {key1: "value1", key2: "value4", key3: "value3"}

Object.assign()

ES6 / ES2015 Object.assignについて言及する価値があるかもしれません。これは_.mergeと同様に機能し、自分でポリフィル行いたい場合、BabelのようなES6 / ES2015ポリフィルをすでに使用している場合に最適なオプションになる可能性があります。

2番目のオブジェクトは、基本オブジェクトを上書きまたは追加します。 undefinedコピーされます。

var obj = {key1: "value1", key2: "value2"};
var obj2 = {key2:"value4", key3: "value3", key4: undefined};
Object.assign(obj, obj2); 
console.log(obj);
// → {key1: "value1", key2: "value4", key3: "value3", key4: undefined}

私は_.mergeが_.extend(destination、other)になったと信じています
AD

_.extend下線ライブラリはまだextendnot を使用しているので、ああ、あなたは正しいです。より普遍的なエイリアスmergeです。回答を更新します。
ネイサンStassen卿

66

これらのいずれかを使用できます(key3が使用する実際のキーである場合)

arr[ 'key3' ] = value3;

または

arr.key3 = value3;

key3が変数の場合は、次のようにする必要があります。

var key3 = 'a_key';
var value3 = 3;
arr[ key3 ] = value3;

この後、リクエストarr.a_keyするとvalue3リテラルの値が返されます3


7
これは配列ではなくオブジェクトです。JS配列は整数でのみインデックスが付けられます。arr.lengthをしようと、それは、この約0.1もっと読みを返します:less-broken.com/blog/2010/12/...
DevAntoine

@DevAntoineのリンクにはアクセスできません。あなたは、この配列型の「長さ」を取得したい場合は、以下を使用します。この問題についてObject.keys(your_array).LENGTHもっと読み、以下を参照してください stackoverflow.com/questions/21356880/array-length-returns-0
THEアンをグエン

また、作成している配列の長さプロパティを単純に上書きすることもできます。var myarray ["length"] = numArrayFieldsを設定すると、この問題が解決します。どういうわけか、配列に追加するフィールドの数を追跡していると仮定します。
ジョンスミス

30
arr.key3 = value3;

あなたのarrは実際には配列ではないので...それはプロトタイプオブジェクトです。実際の配列は次のようになります。

var arr = [{key1: value1}, {key2: value2}];

しかし、それはまだ正しくありません。実際には:

var arr = [{key: key1, value: value1}, {key: key2, value: value2}];

25
var employees = []; 
employees.push({id:100,name:'Yashwant',age:30});
employees.push({id:200,name:'Mahesh',age:35});

22
これはオブジェクトではなく配列用です。
Roly、2015

12

プロパティを追加するだけです:

そして、私たちはprop2 : 2このオブジェクトに追加したいのですが、これらは最も便利なオプションです:

  1. ドット演算子: object.prop2 = 2;
  2. 角括弧: object['prop2'] = 2;

では、どちらを使用するのでしょうか。

ドット演算子はより簡潔な構文であり、デフォルト(imo)として使用する必要があります。ただし、ドット演算子はオブジェクトに動的キーを追加できないため、場合によっては非常に便利です。次に例を示します。

const obj = {
  prop1: 1
}

const key = Math.random() > 0.5 ? 'key1' : 'key2';

obj[key] = 'this value has a dynamic key';

console.log(obj);

オブジェクトのマージ:

2つのオブジェクトのプロパティをマージする場合、これらは最も便利なオプションです。

  1. Object.assign()、ターゲットオブジェクトを引数として取り、1つ以上のソースオブジェクトを取り、それらをマージします。例えば:

const object1 = {
  a: 1,
  b: 2,
};

const object2 = Object.assign({
  c: 3,
  d: 4
}, object1);

console.log(object2);

  1. オブジェクト展開演算子 ...

const obj = {
  prop1: 1,
  prop2: 2
}

const newObj = {
  ...obj,
  prop3: 3,
  prop4: 4
}

console.log(newObj);

どちらを使用しますか?

  • スプレッド構文は冗長性が低く、デフォルトのimoとして使用する必要があります。この構文は比較的新しいため、すべてのブラウザでサポートされている構文に変換することを忘れないでください。
  • Object.assign() 引数として渡されるすべてのオブジェクトにアクセスでき、新しいオブジェクトに割り当てられる前にそれらを操作できるため、より動的です。

1
投稿の上部:中かっこではなく、角かっこです。
ブラムヴァンロイ

11

これについてはすでに受け入れられた回答があることは知っていますが、自分の考えをどこかに文書化すると思いました。[人]このアイデアに穴をあけてください。それが最善の解決策かどうかはわかりませんが...数分前にまとめました:

Object.prototype.push = function( key, value ){
   this[ key ] = value;
   return this;
}

次のように使用します。

var obj = {key1: value1, key2: value2};
obj.push( "key3", "value3" );

プロトタイプ関数が返されthisているので、を変数の.push最後にチェーンし続けることができobjます。obj.push(...).push(...).push(...);

別の機能は、プッシュ関数の引数の値として配列または別のオブジェクトを渡すことができることです。実際の例については私のフィドルを参照してください:http : //jsfiddle.net/7tEme/


多分これは良い解決策ではないかもしれませんが、jquery1.9でエラーが発生しているようです:TypeError: 'undefined' is not a function (evaluating 'U[a].exec(s)')jquery1.9でもjsfiddleで動作するので奇妙です
sadmicrowave

3
Object.prototypeを拡張しないでください。これにより、JavaScriptの「object-as-hashtables」機能(およびその後、Google Maps JS APIなどの多くのライブラリ)が機能しなくなります。:議論を参照してくださいstackoverflow.com/questions/1827458/...
ジャスティン・R.

11

パフォーマンス

今日2020.01.14私は選択したソリューションについて、Chrome v78.0.0、Safari v13.0.4、Firefox v71.0.0のMacOs HighSierra 10.13.6でテストを実行します。可変(最初の文字M)と不変(最初の文字I)のソリューションを分けます。この質問への回答でまだ公開されていない不変のソリューション(IB、IC、ID / IE)もいくつか提供します

結論

  • 最速の可変ソリューションは、最速の不変ソリューションよりもはるかに高速です(> 10x)
  • のような古典的な可変アプローチ obj.key3 = "abc"(MA、MB)のは最速です
  • 不変のソリューションのため{...obj, key3:'abc'}Object.assign(IA、IB)が最速
  • 驚くべきことに、クロム(MC-IA)およびサファリ(MD-IB)の一部の変更可能なソリューションよりも高速な不変のソリューションがあります。

ここに画像の説明を入力してください

詳細

以下のスニペットには、事前にテストされたソリューションがあり、ここでマシン上でテストを実行できます

ここに画像の説明を入力してください


9

@ Ionuț G. Stanの回答でクラスを作成できます

function obj(){
    obj=new Object();
    this.add=function(key,value){
        obj[""+key+""]=value;
    }
    this.obj=obj
}

最後のクラスで新しいオブジェクトを作成します。

my_obj=new obj();
my_obj.add('key1', 'value1');
my_obj.add('key2', 'value2');
my_obj.add('key3','value3');

オブジェクトを印刷する

console.log(my_obj.obj) // Return {key1: "value1", key2: "value2", key3: "value3"} 

キーの印刷

console.log(my_obj.obj["key3"]) //Return value3

私はJavaScriptの初心者です。コメントは大歓迎です。私のために働く。


7

ほとんどの回答ですでに言及されている2つの最もよく使われる方法

obj.key3 = "value3";

obj["key3"] = "value3";

プロパティを定義するもう1つの方法は、Object.defineProperty()を使用することです

Object.defineProperty(obj, 'key3', {
  value: "value3",       // undefined by default
  enumerable: true,      // false by default
  configurable: true,    // false by default
  writable: true         // false by default
});

このメソッドは、プロパティを定義する際により詳細な制御が必要な場合に役立ちます。定義されたプロパティは、ユーザーが列挙可能、構成可能、および書き込み可能として設定できます。


6

あなたの例は、配列ではなくオブジェクトを示しています。その場合、フィールドをオブジェクトに追加するための推奨される方法は、次のようにフィールドに割り当てるだけです。

arr.key3 = value3;

6

あなたがあれば、追加するオブジェクト使用できるキーかどうブラウザのほとんど、それチェックによってサポート可能なことは、既存のキー値をoveridesし、それができない、それが値でキーを追加

例1

let my_object = {};

// now i want to add something in it  

my_object.red = "this is red color";

// { red : "this is red color"}

例2

let my_object = { inside_object : { car : "maruti" }}

// now i want to add something inside object of my object 

my_object.inside_object.plane = "JetKing";

// { inside_object : { car : "maruti" , plane : "JetKing"} }

例3

let my_object = { inside_object : { name : "abhishek" }}

// now i want to add something inside object with new keys birth , gender 

my_object.inside_object.birth = "8 Aug";
my_object.inside_object.gender = "Male";


    // { inside_object : 
//             { name : "abhishek",
//               birth : "8 Aug",
//               gender : "Male" 
//            }   
//       }

5

オブジェクト内に複数の匿名オブジェクトリテラルがあり、キーと値のペアを含む別のオブジェクトを追加する場合は、次のようにします。

Firebug 'the Object:

console.log(Comicbook);

戻り値:

[オブジェクト{name = "Spiderman"、value = "11"}、オブジェクト{name = "Marsipulami"、value = "18"}、オブジェクト{name = "Garfield"、value = "2"}]

コード:

if (typeof Comicbook[3]=='undefined') {
    private_formArray[3] = new Object();
    private_formArray[3]["name"] = "Peanuts";
    private_formArray[3]["value"] = "12";
}

Object {name="Peanuts", value="12"}Comicbookオブジェクトに追加されます


idまたはnameプロパティを使用してオブジェクトをアドレス指定し、追加時に割り当てるためのより適切な他のオプションを適切かつ明確に説明しました。特に、今後さらに多くの小道具が追加される可能性がある場合、同じ方法が適用され、別のコマを追加するだけで、計画を変更する準備が整います
Avia Afer

5

どちらかobj['key3'] = value3またはobj.key3 = value3新しいペアを追加しますobj

ただし、jQueryが言及されていないことはわかっていますが、jQueryを使用している場合は、を介してオブジェクトを追加できます$.extend(obj,{key3: 'value3'})。例えば:

var obj = {key1: 'value1', key2: 'value2'};
$('#ini').append(JSON.stringify(obj));

$.extend(obj,{key3: 'value3'});

$('#ext').append(JSON.stringify(obj));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="ini">Initial: </p>
<p id="ext">Extended: </p>

jQuery。拡張(ターゲット[、オブジェクト1] [、オブジェクトN])は、2つ以上のオブジェクトのコンテンツを最初のオブジェクトにマージします。

また、次を使用して再帰的な追加/変更を行うこともできます$.extend(true,object1,object2);


5

次のJavascript仕様(候補ステージ3)の簡潔で洗練された方法は次のとおりです。

obj = { ... obj, ... { key3 : value3 } }

より深い議論は、Object spread vs Object.assignおよびDr. Axel Rauschmayersのサイトにあります。ます。

リリース8.6.0以降、node.jsですでに動作しています。

最新のリリースのVivaldi、Chrome、Opera、Firefoxはこの機能も知っていますが、Mirosoftは今日まで、Internet ExplorerでもEdgeでも知りません。


5
var arrOfObj = [{name: 'eve'},{name:'john'},{name:'jane'}];
    var injectObj = {isActive:true, timestamp:new Date()};

    // function to inject key values in all object of json array

    function injectKeyValueInArray (array, keyValues){
        return new Promise((resolve, reject) => {
            if (!array.length)
                return resolve(array);

            array.forEach((object) => {
                for (let key in keyValues) {
                    object[key] = keyValues[key]
                }
            });
            resolve(array);
        })
    };

//call function to inject json key value in all array object
    injectKeyValueInArray(arrOfObj,injectObj).then((newArrOfObj)=>{
        console.log(newArrOfObj);
    });

このような出力:-

[ { name: 'eve',
    isActive: true,
    timestamp: 2017-12-16T16:03:53.083Z },
  { name: 'john',
    isActive: true,
    timestamp: 2017-12-16T16:03:53.083Z },
  { name: 'jane',
    isActive: true,
    timestamp: 2017-12-16T16:03:53.083Z } ]

4

次のように追加することもできます:

arr['key3'] = value3;

またはこのように:

arr.key3 = value3;

変数とオブジェクトにキーイング示唆答えは、key3の値が場合にのみ動作しますkey3でした'key3'


4

ECMA-262(http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdfで定義されているプロパティアクセサーによると)でを追加する方法は2つあります。存在するオブジェクト。これらすべての2つの方法で、JavaScriptエンジンは同じように処理します。

最初の方法は、ドット表記を使用することです。

obj.key3 = value3;

しかし、この方法では、IdentifierNameを使用する必要がありますドット表記の後に。

2番目の方法は、ブラケット表記を使用することです。

obj["key3"] = value3;

そして別の形:

var key3 = "key3";
obj[key3] = value3;

このように、括弧表記でIdentifierNameを含む)を使用できます。


4

この方法でもこれを行うことができます。

var myMap = new Map();
myMap.set(0, 'my value1');
myMap.set(1, 'my value2');
 for (var [key, value] of myMap) {
  console.log(key + ' = ' + value);
 }

1

それは過去の問題なので、現在の問題です。もう1つの解決策を提案します。キーと値を関数に渡すだけで、マップオブジェクトを取得できます。

var map = {};
function addValueToMap(key, value) {
map[key] = map[key] || [];
map[key].push(value);
}

2
これは、尋ねられた質問とはまったく関係がないようです。
クエンティン

0

するために先頭に追加して、オブジェクトにキーと値のペアをにするために、その要素を持つ作品最初にこれを実行します。

    var nwrow = {'newkey': 'value' };
    for(var column in row){
        nwrow[column] = row[column];
    }
    row = nwrow;

0

同じことを達成するための最良の方法を以下に示します。

function getKey(key) {
  return `${key}`;
}

var obj = {key1: "value1", key2: "value2", [getKey('key3')]: "value3"};

//console.log(obj);

0

次の{[key]: value}構文を使用して、新しいオブジェクトを作成できます。

const foo = {
  a: 'key',
  b: 'value'
}

const bar = {
  [foo.a]: foo.b
}

console.log(bar); // {key: 'value'}
console.log(bar.key); // value

const baz = {
  ['key2']: 'value2'
}

console.log(baz); // {key2: 'value2'}
console.log(baz.key2); // value2

以前の構文では、spread構文{...foo, ...bar}を使用して、古い値を変更せずに新しいオブジェクトを追加できます。

const foo = {a: 1, b: 2};

const bar = {...foo, ...{['c']: 3}};

console.log(bar); // {a: 1, b: 2, c: 3}
console.log(bar.c); // 3

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.