これが私のオブジェクトリテラルです:
var obj = {key1: value1, key2: value2};
どのように私は、フィールドを追加することができますkey3
しvalue3
、オブジェクトに?
これが私のオブジェクトリテラルです:
var obj = {key1: value1, key2: value2};
どのように私は、フィールドを追加することができますkey3
しvalue3
、オブジェクトに?
回答:
オブジェクトに新しいプロパティを追加するには、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 = [];
var arr = new Array();
Object.keys({"b": 1, "c": 3, "a": 2}).sort().forEach(console.log);
length
プロパティは配列ではないため設定されていません。オブジェクト/マップ/辞書です。
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);
{...}
obj = {...obj, ...pair};
MDNから:
提供されたオブジェクトから新しいオブジェクトに独自の列挙可能なプロパティをコピーします。
シャロークローニング(プロトタイプを除く)またはオブジェクトのマージが、より短い構文を使用して可能になりました
Object.assign()
。は、setterを
Object.assign()
トリガーしますが、spread構文はトリガーしません。
現在のChromeとFirefoxで動作します。彼らはそれが現在のエッジでは機能しないと言います。
var obj = {key1: "value1", key2: "value2"};
var pair = {key3: "value3"};
obj = {...obj, ...pair};
document.body.innerHTML = JSON.stringify(obj);
オブジェクト割り当て演算子 +=
:
obj += {key3: "value3"};
おっと...私は夢中になりました。未来からの密輸情報は違法です。完全に覆い隠された!
const
、のlet
代わりにを使用することをお勧めしvar
ます、それは2018年の方法ですか?
const
それはその利点を取り除くので、私は好きではありません。使うたびに開発の妨げになりました。
Year 2019 answer ... Opps ...
部分はありがとうに値します、あなたは私の日を作りました。ベストアンサー+1
より大きなプロジェクトを書くとき、LoDash / Underscoreが好きになりました。
追加obj['key']
またはobj.key
すべては、JavaScriptの純粋な答えです。ただし、LoDashライブラリとUnderscoreライブラリはどちらも、一般的にオブジェクトと配列を操作するときに多くの便利な関数を提供します。
探しているものに応じて、2つの特定の機能を使用すると便利で、の感覚に似た機能を提供できますarr.push()
。詳細については、ドキュメントをチェックしてください、彼らはそこにいくつかの素晴らしい例を持っています。
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"}
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}
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"}
さらに、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"}
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}
_.extend
下線ライブラリはまだextend
not を使用しているので、ああ、あなたは正しいです。より普遍的なエイリアスmerge
です。回答を更新します。
これらのいずれかを使用できます(key3が使用する実際のキーである場合)
arr[ 'key3' ] = value3;
または
arr.key3 = value3;
key3が変数の場合は、次のようにする必要があります。
var key3 = 'a_key';
var value3 = 3;
arr[ key3 ] = value3;
この後、リクエストarr.a_key
するとvalue3
リテラルの値が返されます3
。
arr.key3 = value3;
あなたのarrは実際には配列ではないので...それはプロトタイプオブジェクトです。実際の配列は次のようになります。
var arr = [{key1: value1}, {key2: value2}];
しかし、それはまだ正しくありません。実際には:
var arr = [{key: key1, value: value1}, {key: key2, value: value2}];
そして、私たちはprop2 : 2
このオブジェクトに追加したいのですが、これらは最も便利なオプションです:
object.prop2 = 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つのオブジェクトのプロパティをマージする場合、これらは最も便利なオプションです。
Object.assign()
、ターゲットオブジェクトを引数として取り、1つ以上のソースオブジェクトを取り、それらをマージします。例えば:const object1 = {
a: 1,
b: 2,
};
const object2 = Object.assign({
c: 3,
d: 4
}, object1);
console.log(object2);
...
const obj = {
prop1: 1,
prop2: 2
}
const newObj = {
...obj,
prop3: 3,
prop4: 4
}
console.log(newObj);
どちらを使用しますか?
Object.assign()
引数として渡されるすべてのオブジェクトにアクセスでき、新しいオブジェクトに割り当てられる前にそれらを操作できるため、より動的です。これについてはすでに受け入れられた回答があることは知っていますが、自分の考えをどこかに文書化すると思いました。[人]このアイデアに穴をあけてください。それが最善の解決策かどうかはわかりませんが...数分前にまとめました:
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/
TypeError: 'undefined' is not a function (evaluating 'U[a].exec(s)')
jquery1.9でもjsfiddleで動作するので奇妙です
今日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)もいくつか提供します
結論
obj.key3 = "abc"
(MA、MB)のは最速です{...obj, key3:'abc'}
とObject.assign
(IA、IB)が最速以下のスニペットには、事前にテストされたソリューションがあり、ここでマシン上でテストを実行できます
@ 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の初心者です。コメントは大歓迎です。私のために働く。
ほとんどの回答ですでに言及されている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
});
このメソッドは、プロパティを定義する際により詳細な制御が必要な場合に役立ちます。定義されたプロパティは、ユーザーが列挙可能、構成可能、および書き込み可能として設定できます。
あなたがあれば、追加するオブジェクト使用できるキーかどうブラウザのほとんど、それチェックによってサポート可能なことは、既存のキー値を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"
// }
// }
オブジェクト内に複数の匿名オブジェクトリテラルがあり、キーと値のペアを含む別のオブジェクトを追加する場合は、次のようにします。
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オブジェクトに追加されます
どちらか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);
。
次の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でも知りません。
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 } ]
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を含む)を使用できます。
次の{[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