Come posso aggiungere una coppia chiave / valore a un oggetto JavaScript?


1383

Ecco il mio oggetto letterale:

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

Come posso aggiungere il campo key3con value3l'oggetto?


2
Bene, l'intero numero di array associativi in ​​JS è strano, perché puoi farlo ... dreaminginjavascript.wordpress.com/2008/06/27/…
— Nosredna,

@Nosredna - il punto è che non ci sono cose come array associativi in ​​javascript. In quell'articolo sta aggiungendo le proprietà dell'oggetto a un oggetto array, ma questi non fanno realmente parte dell'array.
— UpTheCreek,

Esiste un modo per impostare condizionalmente chiave: coppie di valori in un oggetto letterale con future implementazioni di ES +?
— Con Antonakos,

Risposte:


2253

Esistono due modi per aggiungere nuove proprietà a un oggetto:

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

Usando la notazione punto:

obj.key3 = "value3";

Usando la notazione parentesi quadra:

obj["key3"] = "value3";

Il primo modulo viene utilizzato quando si conosce il nome della proprietà. Il secondo modulo viene utilizzato quando il nome della proprietà viene determinato in modo dinamico. Come in questo esempio:

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

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

Un vero array JavaScript può essere costruito usando:

La notazione letterale Array:

var arr = [];

Notazione del costruttore dell'array:

var arr = new Array();

4
obj è un oggetto. La parte tra (e incluso) le parentesi graffe è l'oggetto letterale. obj non è un oggetto letterale.
— Nosredna,

24
cosa succede se la chiave è un numero? obj.123 = 456 non funziona. obj [123] = 456 funziona però
— axel freudiger

10
@axelfreudiger, in effetti, tutto ciò che non è sintatticamente un identificatore di variabile valido deve essere usato con la notazione tra parentesi.
— Ionuț G. Stan,

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

2
@JohnSmith la lengthproprietà non è impostata perché non è un array, è un oggetto / mappa / dizionario.
— Ionuț G. Stan,

348

Anno 2017 risposta: Object.assign()

Object.assign (dest, src1, src2, ...) unisce gli oggetti.

Sovrascrive destcon proprietà e valori di (comunque molti) oggetti sorgente, quindi ritorna dest.

Il Object.assign()metodo viene utilizzato per copiare i valori di tutte le proprietà proprie enumerabili da uno o più oggetti di origine in un oggetto di destinazione. Restituirà l'oggetto di destinazione.

Esempio dal vivo

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

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

Risposta dell'anno 2018: operatore diffusione oggetti {...}

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

Da MDN :

Copia le proprie proprietà enumerabili da un oggetto fornito su un nuovo oggetto.

La clonazione superficiale (escluso il prototipo) o l'unione di oggetti è ora possibile utilizzando una sintassi più breve di Object.assign().

Si noti che Object.assign()innesca setter mentre la sintassi di diffusione no.

Esempio dal vivo

Funziona con l'attuale Chrome e l'attuale Firefox. Dicono che non funziona con Edge corrente.

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

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

Risposta dell'anno 2019

Operatore di assegnazione oggetto += :

obj += {key3: "value3"};

Oops ... Mi sono lasciato trasportare. Il contrabbando di informazioni dal futuro è illegale. Debitamente oscurato!


34
obj + = sembra fantastico
— Mehrdad Shokri,

2
phpstorm consiglia di utilizzare conste letinvece di var, dovrebbe essere il modo 2018?
— Jim Smith,

@jimsmith: non sono sicuro del motivo per cui lo stai dicendo qui. Vuoi la mia opinione? Il vantaggio di un interprete è la possibilità di cambiare tutto dal vivo nella console. Non mi piace constperché rimuove quel vantaggio. Ogni volta che l'ho usato, ha ostacolato lo sviluppo.
— 7vujy0f0hy

siamo nel 2019, ciò significa che l'operatore di assegnazione può essere già utilizzato per sostituire l'operatore di diffusione?
— Mr-Programmi,

2
Un vero programmatore apprezzerà un po 'di divertimento per offrire sollievo a una professione sempre stressante. La tua Year 2019 answer ... Opps ...parte merita un ringraziamento, mi hai reso felice . Migliore risposta +1
— ColinWa,

89

Mi sono affezionato a LoDash / Underscore quando ho scritto progetti più grandi.

Aggiungendo da obj['key']o obj.keysono tutte solide risposte JavaScript pure. Tuttavia, entrambe le librerie LoDash e Underscore offrono molte utili funzioni aggiuntive quando si lavora con oggetti e array in generale.

.push()è per array , non per oggetti .

A seconda di ciò che stai cercando, ci sono due funzioni specifiche che possono essere utili da utilizzare e che offrono funzionalità simili a quelle dell'atmosfera arr.push(). Per maggiori informazioni consulta i documenti, hanno alcuni ottimi esempi lì.

_.merge (solo Lodash)

Il secondo oggetto verrà sovrascritto o aggiunto all'oggetto base. undefinedi valori non vengono copiati.

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

Il secondo oggetto verrà sovrascritto o aggiunto all'oggetto base. undefinedsarà copiato.

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

Il secondo oggetto contiene impostazioni predefinite che verranno aggiunte all'oggetto base se non esistono. undefinedi valori verranno copiati se la chiave esiste già.

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

Inoltre, potrebbe essere utile menzionare jQuery.extend, funziona in modo simile a _.merge e potrebbe essere un'opzione migliore se si sta già utilizzando jQuery.

Il secondo oggetto verrà sovrascritto o aggiunto all'oggetto base. undefinedi valori non vengono copiati.

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 ()

Potrebbe valere la pena menzionare ES6 / ES2015 Object.assign, funziona in modo simile a _.merge e potrebbe essere l'opzione migliore se si sta già utilizzando un polyfill ES6 / ES2015 come Babel se si desidera eseguire il polyfill da soli .

Il secondo oggetto verrà sovrascritto o aggiunto all'oggetto base. undefinedsarà copiato.

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}

Credo _.merge è ora _.extend (destinazione, altri)
— AD

Ah, hai ragione, _.extendè un alias più universale poiché la libreria di sottolineatura è ancora in usoextend non merge. Aggiornerò la mia risposta.
— Sir Nathan Stassen,

66

È possibile utilizzare uno di questi (a condizione che key3 sia la chiave acutal che si desidera utilizzare)

arr[ 'key3' ] = value3;

o

arr.key3 = value3;

Se key3 è una variabile, allora dovresti fare:

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

Dopo questo, la richiesta arr.a_keyrestituirebbe il valore di value3, un valore letterale 3.


7
Questo non è un array ma un oggetto. Le matrici JS sono indicizzate solo per intero. Prova a fare arr.length e restituirà 0. Altre letture al riguardo: less-broken.com/blog/2010/12/…
— DevAntoine,

Il link @ DevAntoine non è accessibile. Se vuoi ottenere la "lunghezza" di questo tipo di array, usa: Object.keys (your_array) .length Altre informazioni su questo problema, vedi: stackoverflow.com/questions/21356880/array-length-returns-0
— Thế Anh Nguyễn,

Si potrebbe anche semplicemente sovrascrivere la proprietà length dell'array che stanno creando. L'impostazione var myarray ["length"] = numArrayFields risolve questo problema per me. Supponendo che tu stia tenendo traccia del numero di campi che stai aggiungendo al tuo array in qualche modo.
— John Smith,

30
arr.key3 = value3;

perché il tuo arr non è davvero un array ... È un oggetto prototipo. Il vero array sarebbe:

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

ma non è ancora giusto. In realtà dovrebbe essere:

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
Questo è per array, non oggetti.
— Roly,

12

Semplicemente aggiungendo proprietà:

E vogliamo aggiungere prop2 : 2a questo oggetto, queste sono le opzioni più convenienti:

  1. Operatore punto: object.prop2 = 2;
  2. parentesi quadre: object['prop2'] = 2;

Quindi quale usiamo allora?

L'operatore punto è una sintassi più pulita e deve essere utilizzata come impostazione predefinita (imo). Tuttavia, l'operatore punto non è in grado di aggiungere chiavi dinamiche a un oggetto, il che può essere molto utile in alcuni casi. Ecco un esempio:

const obj = {
  prop1: 1
}

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

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

console.log(obj);

Unione di oggetti:

Quando vogliamo unire le proprietà di 2 oggetti queste sono le opzioni più convenienti:

  1. Object.assign(), accetta un oggetto target come argomento e uno o più oggetti sorgente e li unirà insieme. Per esempio:

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

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

console.log(object2);

  1. Operatore di diffusione oggetti ...

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

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

console.log(newObj);

Quale usiamo?

  • La sintassi di diffusione è meno dettagliata e deve essere utilizzata come immagine predefinita. Non dimenticare di tradurre questa sintassi in sintassi supportata da tutti i browser perché è relativamente nuova.
  • Object.assign() è più dinamico perché abbiamo accesso a tutti gli oggetti passati come argomenti e li possiamo manipolare prima che vengano assegnati al nuovo oggetto.

1
Nella parte superiore del tuo post: quelle non sono parentesi graffe ma parentesi quadre.
— Bram Vanroy,

11

So che esiste già una risposta accettata per questo, ma ho pensato di documentare la mia idea da qualche parte. Per favore [gente] sentiti libero di creare buchi in questa idea, poiché non sono sicuro che sia la soluzione migliore ... ma ho appena messo insieme alcuni minuti fa:

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

Lo useresti in questo modo:

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

Poiché la funzione prototipo sta tornando this, puoi continuare a concatenare .pushfino alla fine della tua objvariabile:obj.push(...).push(...).push(...);

Un'altra caratteristica è che è possibile passare un array o un altro oggetto come valore negli argomenti della funzione push. Vedi il mio violino per un esempio funzionante: http://jsfiddle.net/7tEme/


forse questa non è una buona soluzione, mi sembra di riscontrare errori in jquery1.9: il TypeError: 'undefined' is not a function (evaluating 'U[a].exec(s)')che è strano perché funziona in jsfiddle anche con jquery1.9
— sadmic Microwave

3
Non dovresti estendere Object.prototype; ciò interrompe la funzione "oggetto come hashtables" di JavaScript (e successivamente molte librerie come l'API JS di Google Maps). Vedi discussione: stackoverflow.com/questions/1827458/…
— Justin R.,

11

Prestazione

Oggi 2020.01.14 eseguo test su MacO HighSierra 10.13.6 su Chrome v78.0.0, Safari v13.0.4 e Firefox v71.0.0, per le soluzioni scelte. Divido le soluzioni a mutable (prima lettera M) e immutabile (prima lettera I). Fornisco anche alcune soluzioni immutabili (IB, IC, ID / IE) non ancora pubblicate nelle risposte a questa domanda

conclusioni

  • le soluzioni mutabili più veloci sono molto più veloci delle immutabili più veloci (> 10x)
  • l'approccio classico mutabile come obj.key3 = "abc"(MA, MB) è il più veloce
  • per soluzioni immutabili il {...obj, key3:'abc'}e Object.assign(IA, IB) sono i più veloci
  • sorprendentemente ci sono soluzioni immutabili più veloci di alcune soluzioni mutabili per Chrome (MC-IA) e Safari (MD-IB)

inserisci qui la descrizione dell'immagine

Dettagli

Nello snippet di seguito sono presenti le soluzioni testate preselezionate, è possibile prefromare il test sulla macchina QUI

inserisci qui la descrizione dell'immagine


9

Puoi creare un corso con la risposta di @ Ionuț G. Stan

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

Creazione di un nuovo oggetto con l'ultima classe:

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

Stampa dell'oggetto

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

Stampa di una chiave

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

Sono novizio in JavaScript, i commenti sono benvenuti. Per me va bene.


7

Due modi più usati già menzionati nella maggior parte delle risposte

obj.key3 = "value3";

obj["key3"] = "value3";

Un altro modo per definire una proprietà è usare 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
});

Questo metodo è utile quando si desidera avere un maggiore controllo durante la definizione della proprietà. La proprietà definita può essere impostata come enumerabile, configurabile e scrivibile dall'utente.


6

Il tuo esempio mostra un oggetto, non una matrice. In tal caso, il modo preferito per aggiungere un campo a un Oggetto è semplicemente assegnarglielo, in questo modo:

arr.key3 = value3;

6

supportato dalla maggior parte dei browser, e controlla se chiave oggetto disponibile o non si desidera aggiungere, se disponibili si overides valore della chiave esistente e disponibile che aggiungere chiave con il valore

Esempio 1

let my_object = {};

// now i want to add something in it  

my_object.red = "this is red color";

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

esempio 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"} }

esempio 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

Nel caso in cui ci siano più valori letterali di oggetti anonimi all'interno di un oggetto e si desidera aggiungere un altro oggetto contenente coppie chiave / valore, procedere come segue:

Firebug 'the Object:

console.log(Comicbook);

ritorna:

[Object {name = "Spiderman", value = "11"}, Object {name = "Marsipulami", value = "18"}, Object {name = "Garfield", value = "2"}]

Codice:

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

verrà aggiunto Object {name="Peanuts", value="12"}all'oggetto Comicbook


ben spiegata in modo chiaro e chiaro un'altra opzione che è più adatta per indirizzare oggetti con una proprietà id o name quindi assegnarla durante l'aggiunta, buona. specialmente quando ha o potrebbe avere in futuro più oggetti di scena si applicherà lo stesso metodo, basta mettere un altro coma ed è pronto per il cambiamento nei piani
— Avia Afer

5

Sia obj['key3'] = value3o obj.key3 = value3aggiungerà la nuova coppia al obj.

Tuttavia, so che jQuery non è stato menzionato, ma se lo stai usando, puoi aggiungere l'oggetto $.extend(obj,{key3: 'value3'}). Per esempio:

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. estendere (target [, object1] [, objectN]) fonde il contenuto di due o più oggetti insieme nel primo oggetto.

E consente anche aggiunte / modifiche ricorsive con $.extend(true,object1,object2);:


5

Un modo breve ed elegante nella prossima specifica Javascript (fase 3 candidata) è:

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

Una discussione più approfondita è disponibile in Object spread vs Object.assign e sul sito del Dr. Axel Rauschmayers .

Funziona già in node.js dalla versione 8.6.0.

Vivaldi, Chrome, Opera e Firefox nelle versioni aggiornate conoscono anche questa funzione, ma Mirosoft non lo fa fino ad oggi, né in Internet Explorer né in 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);
    });

Uscita in questo modo: -

[ { 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

Puoi aggiungerlo in questo modo:

arr['key3'] = value3;

o in questo modo:

arr.key3 = value3;

Le risposte che suggeriscono di digitare l'oggetto con la variabile key3funzionerebbero solo se il valore di key3fosse 'key3'.


4

Secondo gli accessori di proprietà definiti in ECMA-262 ( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf , P67), ci sono due modi in cui puoi fare per aggiungere proprietà a esiste un oggetto. In tutti e due i modi, il motore Javascript li tratterà allo stesso modo.

Il primo modo è usare la notazione punto:

obj.key3 = value3;

Ma in questo modo, dovresti usare un IdentifierName dopo la notazione punto.

Il secondo modo è usare la notazione parentesi:

obj["key3"] = value3;

e un'altra forma:

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

In questo modo, è possibile utilizzare un'espressione (includere IdentifierName ) nella notazione parentesi.


4

Possiamo farlo anche in questo modo.

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

Dal momento che è una questione di passato ma il problema del presente. Suggerirei un'altra soluzione: basta passare la chiave e i valori alla funzione e otterrai un oggetto mappa.

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

2
Ciò non sembra affatto correlato alla domanda che è stata posta.
— Quentin,

0

Per anteporre una coppia chiave-valore a un oggetto in modo che for in lavori con quell'elemento, per prima cosa procedi nel seguente modo:

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

0

Il modo migliore per ottenere lo stesso è indicato di seguito:

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

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

//console.log(obj);

0

È possibile creare un nuovo oggetto utilizzando la {[key]: value}sintassi:

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

Con la sintassi precedente ora puoi usare la sintassi diffusa {...foo, ...bar}per aggiungere un nuovo oggetto senza mutare il tuo vecchio valore:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.