Jak dodać parę klucz / wartość do obiektu JavaScript?

Oto mój obiekt:

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

Jak mogę dodać {key3: value3} do obiektu?

Author: T.J. Crowder, 2009-07-23

22 answers

Istnieją dwa sposoby dodawania nowych właściwości do obiektu:

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

Użycie notacji kropkowej:

obj.key3 = "value3";

Używanie zapisu z nawiasem kwadratowym:

obj["key3"] = "value3";

Pierwszy formularz jest używany, gdy znasz nazwę nieruchomości. Druga forma jest stosowana, gdy nazwa właściwości jest dynamicznie określana. Jak w tym przykładzie:

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

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

A prawdziwa tablica JavaScript może być skonstruowana za pomocą:

Tablica zapis:

var arr = [];

Zapis konstruktora tablicy:

var arr = new Array();
 1716
Author: Ionuț G. Stan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-08 16:36:31

Rok 2017 odpowiedź: Object.assign()

Obiekt.assign(dest, src1, src2,...) łączy obiekty.

Nadpisuje dest z właściwościami i wartościami (jakkolwiek wielu) obiektów źródłowych, a następnie zwraca dest.

Metoda Object.assign() służy do kopiowania wartości wszystkich możliwych do wyliczenia własnych właściwości z jednego lub więcej obiektów źródłowych do obiektu docelowego. Zwróci obiekt docelowy.

Przykład na żywo

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

document.body.innerHTML = JSON.stringify(obj);
Rok 2018 odpowiedź: obiekt spread operator {...}
obj = {...obj, ...pair};

From MDN :

Kopiuje własne właściwości wyliczeniowe z podanego obiektu na nowy obiekt.

Płytkie-klonowanie (z wyłączeniem prototypu) lub łączenie obiektów jest teraz możliwe przy użyciu krótszej składni niż Object.assign().

Zauważ, że Object.assign() wyzwalacze settery podczas gdy składnia spread Nie.

Przykład na żywo

Działa w bieżącym Chrome i obecny Firefox. Mówią, że to nie działa w obecnej krawędzi.

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

document.body.innerHTML = JSON.stringify(obj);
Odpowiedź na rok 2019]}

operator przypisywania obiektów +=:

obj += {key3: "value3"};

UPS... Poniosło mnie. Przemyt informacji z przyszłości jest nielegalny. / Align = "left" /

 109
Author: 7vujy0f0hy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-30 20:31:56

Polubiłem LoDash / podkreślenie podczas pisania większych projektów.

Dodawanie przez obj['key'] lub obj.key to wszystkie stałe, czyste odpowiedzi JavaScript. Jednak zarówno LoDash, jak i biblioteki podkreślenia zapewniają wiele dodatkowych wygodnych funkcji podczas pracy z obiektami i tablicami w ogóle.

.push() jest dla tablic , nie dla obiektów.

W zależności od tego, czego szukasz, istnieją dwie specyficzne funkcje, które mogą być miło wykorzystać i dać funkcjonalność podobną do odczucia arr.push(). Aby uzyskać więcej informacji, sprawdź dokumenty, mają tam kilka świetnych przykładów.

_.merge (tylko Lodash)

Drugi obiekt nadpisze lub doda do obiektu podstawowego. undefined wartości nie są kopiowane.

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

Drugi obiekt nadpisze lub doda do obiektu podstawowego. undefined zostanie skopiowany.

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

The drugi obiekt zawiera wartości domyślne, które zostaną dodane do obiektu podstawowego, jeśli nie istnieją. undefined wartości zostaną skopiowane, jeśli klucz już istnieje.

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

Dodatkowo warto wspomnieć o jQuery.extend, działa podobnie do _.Scal i może być lepszą opcją, jeśli już używasz jQuery.

Drugi obiekt nadpisze lub doda do obiektu podstawowego. undefined wartości nie są zrozumiałem.

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

Obiekt.Przypisz()

Warto wspomnieć o obiekcie ES6 / ES2015.przypisać, działa podobnie do _.połącz i może być najlepszą opcją, jeśli już używasz polyfill ES6 / ES2015, takiego jak Babel jeśli chcesz polyfill samodzielnie.

Drugi obiekt nadpisze lub doda do obiektu podstawowego. undefined zostanie skopiowany.

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}
 78
Author: Sir.Nathan Stassen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-28 17:18:57

Możesz użyć jednego z nich (pod warunkiem, że key3 jest kluczem akutalnym, którego chcesz użyć)

arr[ 'key3' ] = value3;

Lub

arr.key3 = value3;

Jeśli key3 jest zmienną, powinieneś wykonać:

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

Następnie żądanie arr.a_key zwróci wartość value3, literał 3.

 64
Author: seth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-31 00:03:53
arr.key3 = value3;

Ponieważ arr nie jest tak naprawdę tablicą... To prototypowy obiekt. Prawdziwa tablica będzie:

var arr = [{key1: value1}, {key2: value2}];
Ale to wciąż nie w porządku. Powinno być:
var arr = [{key: key1, value: value1}, {key: key2, value: value2}];
 27
Author: Robert Koritnik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 23:25:33
var employees = []; 
employees.push({id:100,name:'Yashwant',age:30});
employees.push({id:200,name:'Mahesh',age:35});
 23
Author: Vicky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-26 08:46:16

Wiem, że istnieje już akceptowana odpowiedź na to pytanie, ale pomyślałem, że gdzieś udokumentuję swój pomysł. Zapraszam do dziurkowania w tym pomyśle, bo nie jestem pewien, czy jest to najlepsze rozwiązanie... ale poskładałem to kilka minut temu:

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

Wykorzystałbyś to w ten sposób:

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

Ponieważ funkcja prototype zwraca this możesz kontynuować łańcuch .push do końca swojej zmiennej obj: obj.push(...).push(...).push(...);

Inną cechą jest to, że można przekazać array lub inny obiekt jako wartość w argumentach funkcji push. Zobacz mój przykład pracy: http://jsfiddle.net/7tEme/

 9
Author: sadmicrowave,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-26 18:34:00

Możesz utworzyć klasę z odpowiedzią @Ionuț G. Stan

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

Tworzenie nowego obiektu z ostatnią klasą:

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

Drukowanie obiektu

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

Drukowanie klucza

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

Jestem newbie w javascript, komentarze są mile widziane. Mi pasuje.

 8
Author: Eduen Sarceno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:29

Twój przykład pokazuje obiekt, a nie tablicę. W takim przypadku preferowanym sposobem dodawania pola do obiektu jest po prostu przypisanie do niego, w ten sposób:

arr.key3 = value3;
 6
Author: bdukes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 23:25:57

Dwa najczęściej używane sposoby już wymienione w większości odpowiedzi

obj.key3 = "value3";

obj["key3"] = "value3";

Innym sposobem definiowania właściwości jest użycie obiektu.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
});

Ta metoda jest przydatna, gdy chcesz mieć większą kontrolę podczas definiowania właściwości. Właściwość zdefiniowana może być ustawiona jako wyliczalna, konfigurowalna i zapisywalna przez użytkownika.

 6
Author: Sanchay Kumar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-13 06:14:37

Jeśli wewnątrz obiektu znajduje się wiele anonimowych liter obiektu i chcesz dodać kolejny obiekt zawierający pary klucz / wartość, zrób to:

Firebug ' obiekt:

console.log(Comicbook);

Zwraca:

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

Kod:

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

Doda Object {name="Peanuts", value="12"} do obiektu Comicbook

 5
Author: nottinhill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-01 14:28:41

Albo obj['key3'] = value3 albo obj.key3 = value3 doda nową parę do obj.

Wiem jednak, że jQuery nie było wspomniane, ale jeśli go używasz, możesz dodać obiekt przez $.extend(obj,{key3: 'value3'}). Np.:

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.extend(target[,object1][,objectN]) Scala zawartość dwóch lub więcej obiektów razem w pierwszy obiekt.

I umożliwia również rekurencyjne dodawanie/modyfikowanie za pomocą $.extend(true,object1,object2);:

var object1 = {
  apple: 0,
  banana: { weight: 52, price: 100 },
  cherry: 97
};
var object2 = {
  banana: { price: 200 },
  durian: 100
};
$("#ini").append(JSON.stringify(object1));    

$.extend( true, object1, object2 );
 
$("#ext").append(JSON.stringify(object1));
<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>
 5
Author: Armfoot,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-08 17:47:25

Możesz dodać to w ten sposób:

arr['key3'] = value3;

Lub w ten sposób:

arr.key3 = value3;

Odpowiedzi sugerujące wejście do obiektu ze zmienną key3 zadziałałyby tylko wtedy, gdy wartość key3 wynosi 'key3'.

 4
Author: wombleton,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 23:33:35

Zgodnie z właściwościami Accessors zdefiniowanymi w ECMA-262( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf , P67), istnieją dwa sposoby dodawania właściwości do istniejącego obiektu. Wszystkie te dwa sposoby, silnik Javascript będzie traktować je tak samo.

Pierwszym sposobem jest użycie notacji kropkowej:

obj.key3 = value3;

Ale w ten sposób powinieneś użyć identyfikatora po notacji kropkowej.

Drugim sposobem jest użycie nawiasu zapis:

obj["key3"] = value3;

I inna forma:

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

W ten sposób możesz użyć wyrażenia (include IdentifierName) w notacji nawiasowej.

 4
Author: Chen Yang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-02 03:51:40

Krótki i elegancki sposób w następnej specyfikacji Javascript (kandydat etap 3) jest:

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

Głębszą dyskusję można znaleźć w object spread vs Object.przypisać i na Dr. Axel rauschmayers site .

Działa już w node.js od wydania 8.6.0.

Vivaldi, Chrome, Opera i Firefox w aktualnych wydaniach znają tę funkcję również, ale Mirosoft nie do dziś, ani w Internet Explorerze, ani w Edge.
 3
Author: xyxyber,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-04 19:00:55
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);
    });

Wyjście w ten sposób:-

[ { 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 } ]
 3
Author: Sayed Tauseef Haider Naqvi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-16 16:10:44

Możemy to zrobić również w ten sposób.

var myMap = new Map();
myMap.set(0, 'my value1');
myMap.set(1, 'my value2');
 for (var [key, value] of myMap) {
  console.log(key + ' = ' + value);
 }
 2
Author: Miraj Hamid,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-07 03:36:55

Ponieważ jest to kwestia przeszłości, ale problem teraźniejszości. Sugerowałoby jeszcze jedno rozwiązanie: po prostu przekaż klucz i wartości do funkcji, a otrzymasz obiekt mapy.

var map = {};
function addValueToMap(key, value) {
map[key] = map[key] || [];
map[key].push(value);
}
 1
Author: PPing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-16 11:42:06

W celu prepend para klucz-wartość do obiektu, więc for in działa z tym elementem najpierw wykonaj następujące czynności:

    var nwrow = {'newkey': 'value' };
    for(var column in row){
        nwrow[column] = row[column];
    }
    row = nwrow;
 0
Author: relipse,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-08 22:24:04

Najlepszy sposób na osiągnięcie tego samego jest podany poniżej:

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

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

//console.log(obj);
 0
Author: sgajera,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-21 04:19:41

Proste dodawanie właściwości:

I chcemy dodać prop2 : 2 do tego obiektu, są to najwygodniejsze opcje:

  1. operator kropki: object.prop2 = 2;
  2. nawiasy kwadratowe: object['prop2'] = 2;

Więc którego z nich użyjemy?

Operator dot jest bardziej czystą składnią i powinien być używany jako domyślny (imo). Operator dot nie jest jednak w stanie dodawać dynamicznych klawiszy do obiektu, co może być bardzo przydatne w niektórych przypadkach. Oto przykład:

const obj = {
  prop1: 1
}

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

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

console.log(obj);

Scalanie obiektów:

Gdy chcemy połączyć właściwości 2 obiektów są to najwygodniejsze opcje:

  1. Object.assign(), pobiera obiekt docelowy jako argument oraz jeden lub więcej obiektów źródłowych i Scala je razem. Na przykład:

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

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

console.log(object2);
  1. Operator rozprzestrzeniania obiektów ...

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

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

console.log(newObj);

Który z nas użyć?

  • składnia spread jest mniej wyrazista i powinna być używana jako domyślna imo. Nie zapomnij przenieść tej składni do składni, która jest obsługiwana przez wszystkie przeglądarki, ponieważ jest stosunkowo nowa.
  • Object.assign() jest bardziej dynamiczne, ponieważ mamy dostęp do wszystkich obiektów, które są przekazywane jako argumenty i możemy nimi manipulować, zanim zostaną przypisane do nowego obiektu.
 0
Author: Willem van der Veen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-23 20:01:57
arr.push({key3: value3});
 -17
Author: dfa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-22 23:23:04