Как я могу добавить пару ключ / значение к объекту JavaScript?

Вот мой объектный литерал:

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

Как добавить к объекту поле key3 с value3?


person James Skidmore    schedule 22.07.2009    source источник
comment
Что ж, проблема ассоциативных массивов в JS странная, потому что вы можете это сделать ... dreaminginjavascript.wordpress.com/2008/06/27/   -  person Nosredna    schedule 23.07.2009
comment
@Nosredna - дело в том, что в javascript нет ассоциативных массивов. В этой статье он добавляет свойства объекта к объекту массива, но на самом деле они не являются частью «массива».   -  person UpTheCreek    schedule 30.08.2012
comment
Есть ли способ условно установить пары ключ: значение в литерале объекта в будущих реализациях ES +?   -  person Con Antonakos    schedule 01.04.2016


Ответы (26)


Есть два способа добавить объекту новые свойства:

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

Использование точечной записи:

obj.key3 = "value3";

Использование квадратных скобок:

obj["key3"] = "value3";

Первая форма используется, когда вы знаете название собственности. Вторая форма используется, когда имя свойства определяется динамически. Как в этом примере:

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

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

Настоящий массив JavaScript можно создать, используя:

Буквальное обозначение массива:

var arr = [];

Обозначение конструктора массива:

var arr = new Array();
person Ionuț G. Stan    schedule 22.07.2009
comment
Да Носредна, ты прав. Я исправил после вашего комментария к ответу Сета. Я знаю последствия, это была просто инерция моего разума :) - person Ionuț G. Stan; 23.07.2009
comment
obj - это объект. Часть между фигурными скобками (включительно) является литералом объекта. obj не является литералом объекта. - person Nosredna; 23.07.2009
comment
... хотя рекомендуется (также JSLint) использовать первую нотацию конструктора Array ... Просто чтобы мы поняли это ... - person Robert Koritnik; 29.08.2012
comment
что, если ключ - это число? obj.123 = 456 не работает. obj [123] = 456 действительно работает - person axel freudiger; 02.11.2012
comment
@axelfreudiger действительно, все, что синтаксически не является допустимым идентификатором переменной, должно использоваться с обозначением скобок. - person Ionuț G. Stan; 02.11.2012
comment
Использование obj ['newvalue'] = 'blah; не добавляет его в конец, насколько я могу судить. Он добавляет это в начале - person Metropolis; 25.03.2014
comment
@ Ionuț G. Stan Можно ли улучшить ответ, сказав, что вы можете динамически устанавливать ключ литерала объекта, например, в следующем цикле for: for (var pIdx = 0; pIdx < products.length; pIdx ++) { var id = products[pIdx].id; productById[id] = products[pIdx]; } - person Kent Bull; 07.04.2014
comment
Если используется запись в скобках, я предполагаю, что ключ хранится в виде строки? Что произойдет, если использовать точечную нотацию - будет ли ключ также сохранен в виде строки? - person ayjay; 13.06.2014
comment
Вероятно, не слишком важно (особенно излишне для такого простого вопроса), но было бы неплохо включить возможность добавления свойства с помощью Object.defineProperty, поскольку оно довольно хорошо поддерживается в современных браузерах. - person Ian; 29.07.2014
comment
Могу ли я отсортировать по значениям? например, я хочу перебирать ключи, начиная с ключа с наименьшим значением - person Khalil Khalaf; 09.06.2017
comment
@KyleKhalaf Object.keys({"b": 1, "c": 3, "a": 2}).sort().forEach(console.log); - person Ionuț G. Stan; 09.06.2017
comment
Потрясающие! что, если значение представляет собой массив элементов, и я хочу начать с ключа, имеющего наименьший массив? - person Khalil Khalaf; 09.06.2017
comment
@KyleKhalaf Взгляните на Array.sort, вы можете дать ему специальную функцию сравнения: developer.mozilla.org/en/docs/Web/JavaScript/Reference/ - person Ionuț G. Stan; 09.06.2017
comment
Знаете ли вы, что если вы создадите массив с динамическими парами ключ / значение, его свойство length будет равно нулю? Чтобы решить эту проблему, можно просто перезаписать свойство длины создаваемого массива. Установка var myarray [length] = numArrayFields решила эту проблему для меня. Предполагая, что вы отслеживаете количество полей, которые каким-то образом добавляете в свой массив. - person John Smith; 17.04.2018
comment
@JohnSmith свойство length не установлено, потому что это не массив, а объект / карта / словарь. - person Ionuț G. Stan; 17.04.2018
comment
использование точечной нотации не позволяет добавлять значение в var в качестве ключа объекта - person Piyush; 11.05.2020
comment
Был ли способ использовать Key = ›Value Syntax или Я запутался с php. Конечно, я видел реализацию Js Css, где они использовали стрелку, чтобы указывать на значения ... - person Ryan Stone; 13.10.2020
comment
@RyanStone Я думаю, вы видели выражение функции: разработчик. mozilla.org/en-US/docs/Web/JavaScript/Reference/ - person Ionuț G. Stan; 13.10.2020
comment
Как вставить пару ключ-значение в определенный индекс? Или объекты JS неупорядочены, как словари Python? - person mLstudent33; 14.11.2020
comment
Можем ли мы также использовать .push () для вставки пар? - person deep206; 08.02.2021

Ответ за 2017 год: Object.assign()

Object.assign (dest, src1, src2,. ..) объединяет объекты.

Он перезаписывает dest свойствами и значениями (сколь угодно большим) исходных объектов, а затем возвращает dest.

Метод Object.assign() используется для копирования значений всех перечислимых собственных свойств из одного или нескольких исходных объектов в целевой объект. Он вернет целевой объект.

Живой пример

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

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

Ответ за 2018 год: оператор распространения объекта {...}

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

Из MDN:

Он копирует собственные перечислимые свойства из предоставленного объекта в новый объект.

Поверхностное клонирование (за исключением прототипа) или слияние объектов теперь возможно с использованием более короткого синтаксиса, чем _ 8_.

Обратите внимание, что Object.assign() запускает сеттеры, тогда как синтаксис распространения - нет.

Живой пример

Он работает в текущем Chrome и текущем Firefox. Говорят, в текущем Edge не работает.

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

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

Год 2019 ответ

Оператор назначения объекта += :

obj += {key3: "value3"};

Упс ... Увлекся. Вывоз информации из будущего незаконен. Должным образом скрыто!

person 7vujy0f0hy    schedule 04.11.2017
comment
obj + = звучит потрясающе - person Mehrdad Shokri; 11.01.2018
comment
phpstorm рекомендует использовать const и let вместо var, должно ли быть так в 2018 году? - person jim smith; 12.11.2018
comment
@jimsmith: Не понимаю, почему ты это говоришь здесь. Вам нужно мое мнение? Преимущество интерпретатора - возможность изменять все в реальном времени в консоли. Я не люблю const, потому что он лишает меня этого преимущества. Каждый раз, когда я его использовал, это мешало развитию. - person 7vujy0f0hy; 24.11.2018
comment
мы в 2019 году, означает ли это, что оператор присваивания уже можно использовать для замены оператора спреда? - person Mr-Programs; 20.01.2019
comment
@ Mr-Programs: Блин! Мы уже в будущем ?! Спасибо, что разбудил меня. К сожалению, моя безответственная болтовня нарушила наши сроки. Так что для нас нет оператора присваивания объектов ☹. Однако мы не упустили цель слишком далеко, всего три воображаемых парсека. Вы все еще можете достичь этого, если будете интенсивно медитировать. - person 7vujy0f0hy; 04.02.2019
comment
Не могли бы вы помочь мне добавить данные на обоих (двух) уровнях для этого примера? По какой-то причине я просто не могу понять: newObj[that.catToApp[that.dataResult[dataRow.data_id].cat_id].name] = { [that.dataResult[dataRow.data_id].ts]: { [dataRow.data_id] : that.dataResult[dataRow.data_id] } } - person W.Doch; 16.04.2019
comment
Настоящий программист будет ценить развлечения, чтобы избавиться от постоянно вызывающей стресс профессии. Ваша Year 2019 answer ... Opps ... часть заслуживает Спасибо, вы сделали мой день. Лучший ответ +1 - person ColinWa; 02.10.2019
comment
мы находимся в 2020 году, означает ли это, что оператор присваивания уже можно использовать для замены оператора спреда? - person Toivo Säwén; 09.01.2020
comment
LOL .. Я просто использовал это спонтанно (конечно, не сработало), прежде чем я оказался здесь - person alaswer; 15.02.2020
comment
отличный ответ, просто хотел посмотреть, как будет выглядеть 2050: D - person Arjit Sharma; 06.01.2021

Я полюбил LoDash / Подчеркните при написании больших проектов.

Добавление с помощью obj['key'] или obj.key - все это надежные ответы на чистом JavaScript. Однако библиотеки LoDash и Underscore предоставляют множество дополнительных удобных функций при работе с объектами и массивами в целом.

.push() предназначен для массивов, а не для объекты.

В зависимости от того, что вы ищете, есть две конкретные функции, которые может быть полезно использовать и которые дают функциональность, аналогичную ощущению от arr.push(). Для получения дополнительной информации проверьте документацию, там есть несколько отличных примеров.

_.merge (только Lodash)

Второй объект будет перезаписан или добавлен к базовому объекту. 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

Второй объект будет перезаписан или добавлен к базовому объекту. 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

Второй объект содержит значения по умолчанию, которые будут добавлены к базовому объекту, если они не существуют. 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.

Второй объект будет перезаписан или добавлен к базовому объекту. 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 и может быть лучшим вариантом, если вы уже используете полифил ES6 / ES2015, например Babel, если вы хотите самим полифиллом.

Второй объект будет перезаписан или добавлен к базовому объекту. 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}
person Sir.Nathan Stassen    schedule 24.11.2014
comment
Я считаю, что _.merge теперь _.extend (пункт назначения, другие) - person A.D; 09.12.2015
comment
Ах, вы правы, _.extend - более универсальный псевдоним, поскольку библиотека подчеркивания все еще использует extend, а не merge. Я обновлю свой ответ. - person Sir.Nathan Stassen; 09.12.2015

Вы можете использовать любой из них (при условии, что key3 - это фактический ключ, который вы хотите использовать)

arr[ 'key3' ] = value3;

or

arr.key3 = value3;

Если key3 - переменная, вам следует сделать:

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

После этого запрос arr.a_key вернет значение value3, буквальное значение 3.

person seth    schedule 22.07.2009
comment
Это не массив, а объект. Массивы JS индексируются только целыми числами. Попробуйте выполнить arr.length, и он вернет 0. Подробнее об этом: less-broken.com/blog/2010/12/ - person DevAntoine; 18.07.2012
comment
Ссылка @ DevAntoine недоступна. Если вы хотите получить длину этого типа массива, используйте: Object.keys (your_array) .length Дополнительные сведения об этой проблеме см. В: stackoverflow.com/questions/21356880/array-length-returns-0 - person The Anh Nguyen; 14.03.2018
comment
Можно также просто перезаписать свойство длины создаваемого массива. Установка var myarray [length] = numArrayFields решает эту проблему для меня. Предполагая, что вы отслеживаете количество полей, которые каким-то образом добавляете в свой массив. - person John Smith; 17.04.2018

Представление

Сегодня 2020.01.14 я провожу тесты на MacOs HighSierra 10.13.6 на Chrome v78.0.0, Safari v13.0.4 и Firefox v71.0.0 для выбранных решений. Я делю решения на изменяемые (первая буква M) и неизменяемые (первая буква I). Я также предлагаю несколько неизменяемых решений (IB, IC, ID / IE), которые еще не опубликованы в ответах на этот вопрос.

Выводы

  • самые быстрые изменяемые решения намного быстрее, чем самые быстрые неизменяемые (> 10x)
  • классический изменчивый подход, такой как obj.key3 = "abc" (MA, MB), самый быстрый
  • для неизменяемых решений {...obj, key3:'abc'} и Object.assign (IA, IB) являются самыми быстрыми
  • на удивление, есть неизменяемые решения быстрее, чем некоторые изменяемые решения для хрома (MC-IA) и сафари (MD-IB)

введите описание изображения здесь

Подробности

In snippet below there are presended tested solution, you can prefrom test on your machine HERE

var o = {
    key1: true,
    key2: 3,
};

var log= (s,f)=> console.log(`${s} --> ${JSON.stringify(f({...o}))}`);



function MA(obj) {
  obj.key3 = "abc";
  return obj;
}

function MB(obj) {
  obj['key3'] = "abc";
  return obj;
}

function MC(obj) {
  Object.assign(obj, {key3:'abc'});
  return obj;
}

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

function IA(obj) {
  return {...obj, key3:'abc'};
}

function IB(obj) {
  return Object.assign({key3:'abc'}, obj);
}

function IC(obj) {
  let ob= JSON.parse(JSON.stringify(obj))
  ob.key3 = 'abc';
  return ob;
}


function ID(obj) {
	let ob= Object.fromEntries(Object.entries(obj));
  ob.key3 = 'abc';
  return ob;
}

function IE(obj) {
	return Object.fromEntries(Object.entries(obj).concat([['key3','abc']]))
}



log('MA',MA);
log('MB',MB);
log('MC',MC);
log('MD',MD);
log('IA',IA);
log('IB',IB);
log('IC',IC);
log('ID',ID);
log('IE',IE);
This snippet only presents code - it not perform tests itself!

введите описание изображения здесь

person Kamil Kiełczewski    schedule 14.01.2020

arr.key3 = value3;

потому что ваш arr на самом деле не массив ... Это объект-прототип. Реальный массив будет:

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

но это все равно не так. На самом деле это должно быть:

var arr = [{key: key1, value: value1}, {key: key2, value: value2}];
person Robert Koritnik    schedule 22.07.2009

Я знаю, что на это уже есть принятый ответ, но я подумал, что где-нибудь задокументирую свою идею. Пожалуйста, [люди] не стесняйтесь проделывать дыры в этой идее, поскольку я не уверен, что это лучшее решение ... но я просто собрал это несколько минут назад:

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

Другая особенность заключается в том, что вы можете передать массив или другой объект в качестве значения в аргументах функции push. См. Мою скрипку для рабочего примера: http://jsfiddle.net/7tEme/

person sadmicrowave    schedule 26.06.2013
comment
возможно, это не лучшее решение, похоже, у меня возникают ошибки в jquery1.9: TypeError: 'undefined' is not a function (evaluating 'U[a].exec(s)'), что странно, потому что он работает в jsfiddle даже с jquery1.9 - person sadmicrowave; 26.06.2013
comment
Не следует расширять Object.prototype; это нарушает функцию "объект как хэш-таблицы" в JavaScript (и, следовательно, во многих библиотеках, таких как Google Maps JS API). См. Обсуждение: stackoverflow.com/questions/1827458 / - person Justin R.; 03.10.2013

Просто добавив свойства:

И мы хотим добавить к этому объекту 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);

Объединение объектов:

Когда мы хотим объединить свойства двух объектов, это наиболее удобные варианты:

  1. Object.assign(), принимает целевой объект в качестве аргумента и один или несколько исходных объектов и объединяет их вместе. Например:

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() более динамичен, потому что у нас есть доступ ко всем объектам, которые передаются в качестве аргументов, и мы можем манипулировать ими до того, как они будут назначены новому объекту.
person Willem van der Veen    schedule 16.08.2018
comment
Вверху сообщения: это не фигурные скобки, а квадратные скобки. - person Bram Vanroy; 23.08.2018

Вы можете создать класс с ответом @ 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, комментарии приветствуются. Работает для меня.

person Eduen Sarceno    schedule 28.12.2013

Два наиболее часто используемых способа, уже упомянутых в большинстве ответов

obj.key3 = "value3";

obj["key3"] = "value3";

Еще один способ определить свойство - использовать 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
});

Этот метод полезен, когда вы хотите иметь больший контроль при определении свойства. Определенное свойство может быть установлено как перечисляемое, настраиваемое и доступное для записи пользователем.

person Sanchay Kumar    schedule 13.01.2017

В вашем примере показан объект, а не массив. В этом случае предпочтительный способ добавить поле к объекту - просто присвоить ему поле, например:

arr.key3 = value3;
person bdukes    schedule 22.07.2009

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 } ]
person Sayed Tauseef Haider Naqvi    schedule 16.12.2017

поддерживается большинством браузеров и проверяет, доступен ли ключ объекта или нет, если он доступен, он переопределяет существующее значение ключа и недоступен это добавить ключ со значением

пример 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" 
//            }   
//       }
person Abhishek Garg    schedule 19.11.2018

Если у вас есть несколько анонимных литералов объекта внутри объекта и вы хотите добавить еще один объект, содержащий пары ключ / значение, сделайте следующее:

Firebug 'объект:

console.log(Comicbook);

возвращает:

[Объект {name = "Человек-паук", 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

person Steve K    schedule 01.08.2012
comment
красиво и четко объяснил другой вариант, который больше подходит для адресации объектов с идентификатором или свойством имени, а затем присваивает его при добавлении, хороший вариант. особенно, когда у него есть или может быть в будущем больше реквизита, будет применяться тот же метод, просто поставьте еще одну кому, и он готов к изменению в планах - person Avia Afer; 22.03.2016

Либо obj['key3'] = value3, либо obj.key3 = value3 добавят новую пару в obj.

Однако я знаю, что 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. extend (target [, object1] [, objectN]) объединяет содержимое два или более объекта вместе в первый объект.

И это также позволяет рекурсивное добавление / изменение с помощью $.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>

person Armfoot    schedule 08.06.2015

Краткий и элегантный способ в следующей спецификации Javascript (кандидатский этап 3):

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

Более подробное обсуждение можно найти в Распространение объекта и Object.assign и на Д-р. Сайт Акселя Раушмайерса.

Он уже работает в node.js, начиная с выпуска 8.6.0.

Vivaldi, Chrome, Opera и Firefox в последних выпусках также знают эту функцию, но Mirosoft не знает этого до сегодняшнего дня, ни в Internet Explorer, ни в Edge.

person xyxyber    schedule 25.11.2017

Мы можем добавить пару ключ / значение к объекту JavaScript разными способами ...

СЛУЧАЙ - 1: Расширение объекта
С его помощью мы можем добавить несколько key: value к объекту одновременно.

const rectangle = { width: 4, height: 6 };
const cube = {...rectangle, length: 7};
const cube2 = {...rectangle, length: 7, stroke: 2};
  console.log("Cube2: ", cube2);
  console.log("Cube: ", cube);
  console.log("Rectangle: ", rectangle);

СЛУЧАЙ - 2: Использование обозначения dot

var rectangle = { width: 4, height: 6 };
rectangle.length = 7;
console.log(rectangle);

СЛУЧАЙ - 3: Использование обозначения [square]

var rectangle = { width: 4, height: 6 };
    rectangle["length"] = 7;
    console.log(rectangle);

person Rohit Tagadiya    schedule 11.02.2021

Вы можете добавить это так:

arr['key3'] = value3;

или так:

arr.key3 = value3;

Ответы, предлагающие ввести объект с помощью переменной key3, будут работать, только если значение key3 было 'key3'.

person wombleton    schedule 22.07.2009

Согласно Аксессуарам собственности, определенным в ECMA-262 (http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf, P67), есть два способа добавить свойства в существующий объект. Во всех этих двух случаях движок Javascript будет относиться к ним одинаково.

Первый способ - использовать точечную нотацию:

obj.key3 = value3;

Но в этом случае вы должны использовать IdentifierName после записи через точку.

Второй способ - использовать скобки:

obj["key3"] = value3;

и другая форма:

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

Таким образом, вы можете использовать Expression (включая IdentifierName) в обозначении скобок.

person Chen Yang    schedule 02.08.2013

Мы тоже можем это сделать.

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

Вы можете создать новый объект, используя синтаксис {[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

С предыдущим синтаксисом теперь вы можете использовать синтаксис распространения {...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

person Jonathan Stellwag    schedule 19.05.2020

Оператор распространения - это полезный и быстрый синтаксис для добавления элементов в массивы, объединения массивов или объектов и распределения массива по аргументам функции. Теперь в ES2018 добавлены свойства распространения для литералов объектов. Он копирует свои собственные перечислимые свойства из предоставленного объекта в новый объект.

Синтаксис распространения полезен для объединения свойств и методов объектов в новый объект:

Вы можете добавить свойство в такой объект

const obj1 = {hello: "????"};
const obj2 = {...obj1, laugh: "????" };
console.log('obj1', obj1)
console.log('obj2', obj2)

Вы также можете комбинировать такие объекты

const objectOne = {hello: "????"}
const objectTwo = {world: "????"}
const objectThree = {...objectOne, ...objectTwo, laugh: "????"}
console.log(objectThree) // Object { hello: "????", world: "????", laugh: "????" }
const objectFour = {...objectOne, ...objectTwo, laugh: () => {console.log("????".repeat(5))}}
objectFour.laugh() // 

person Subham Goyal    schedule 12.05.2021

Чтобы добавить пару "ключ-значение" к объекту, чтобы for in работал с этим элементом, сначала выполните следующие действия:

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

Лучший способ добиться того же указан ниже:

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

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

//console.log(obj);
person sgajera    schedule 21.11.2017

Поскольку это вопрос прошлого, но проблема настоящего. Предложил бы еще одно решение: просто передайте ключ и значения функции, и вы получите объект карты.

var map = {};
function addValueToMap(key, value) {
map[key] = map[key] || [];
map[key].push(value);
}
person PPing    schedule 16.02.2018
comment
Похоже, это вообще не имеет отношения к заданному вопросу. - person Quentin; 16.02.2018

person    schedule
comment
Это для массивов, а не для объектов. - person Roly; 28.02.2015