Вот мой объектный литерал:
var obj = {key1: value1, key2: value2};
Как добавить к объекту поле key3
с value3
?
Вот мой объектный литерал:
var obj = {key1: value1, key2: value2};
Как добавить к объекту поле key3
с value3
?
Есть два способа добавить объекту новые свойства:
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();
for (var pIdx = 0; pIdx < products.length; pIdx ++) { var id = products[pIdx].id; productById[id] = products[pIdx]; }
- person Kent Bull; 07.04.2014
Object.defineProperty
, поскольку оно довольно хорошо поддерживается в современных браузерах.
- person Ian; 29.07.2014
Object.keys({"b": 1, "c": 3, "a": 2}).sort().forEach(console.log);
- person Ionuț G. Stan; 09.06.2017
Array.sort
, вы можете дать ему специальную функцию сравнения: developer.mozilla.org/en/docs/Web/JavaScript/Reference/
- person Ionuț G. Stan; 09.06.2017
length
не установлено, потому что это не массив, а объект / карта / словарь.
- person Ionuț G. Stan; 17.04.2018
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);
{...}
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);
Оператор назначения объекта +=
:
obj += {key3: "value3"};
Упс ... Увлекся. Вывоз информации из будущего незаконен. Должным образом скрыто!
const
и let
вместо var
, должно ли быть так в 2018 году?
- person jim smith; 12.11.2018
const
, потому что он лишает меня этого преимущества. Каждый раз, когда я его использовал, это мешало развитию.
- person 7vujy0f0hy; 24.11.2018
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
Year 2019 answer ... Opps ...
часть заслуживает Спасибо, вы сделали мой день. Лучший ответ +1
- person ColinWa; 02.10.2019
Я полюбил LoDash / Подчеркните при написании больших проектов.
Добавление с помощью obj['key']
или obj.key
- все это надежные ответы на чистом JavaScript. Однако библиотеки LoDash и Underscore предоставляют множество дополнительных удобных функций при работе с объектами и массивами в целом.
.push()
предназначен для массивов, а не для объекты.
В зависимости от того, что вы ищете, есть две конкретные функции, которые может быть полезно использовать и которые дают функциональность, аналогичную ощущению от arr.push()
. Для получения дополнительной информации проверьте документацию, там есть несколько отличных примеров.
Второй объект будет перезаписан или добавлен к базовому объекту. 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"}
Второй объект будет перезаписан или добавлен к базовому объекту. 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}
Второй объект содержит значения по умолчанию, которые будут добавлены к базовому объекту, если они не существуют. 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.
Второй объект будет перезаписан или добавлен к базовому объекту. 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 и может быть лучшим вариантом, если вы уже используете полифил 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}
_.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
.
Сегодня 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), которые еще не опубликованы в ответах на этот вопрос.
Выводы
obj.key3 = "abc"
(MA, MB), самый быстрый{...obj, key3:'abc'}
и Object.assign
(IA, 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!
arr.key3 = value3;
потому что ваш arr на самом деле не массив ... Это объект-прототип. Реальный массив будет:
var arr = [{key1: value1}, {key2: value2}];
но это все равно не так. На самом деле это должно быть:
var arr = [{key: key1, value: value1}, {key: key2, value: value2}];
Я знаю, что на это уже есть принятый ответ, но я подумал, что где-нибудь задокументирую свою идею. Пожалуйста, [люди] не стесняйтесь проделывать дыры в этой идее, поскольку я не уверен, что это лучшее решение ... но я просто собрал это несколько минут назад:
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/
TypeError: 'undefined' is not a function (evaluating 'U[a].exec(s)')
, что странно, потому что он работает в jsfiddle даже с jquery1.9
- person sadmicrowave; 26.06.2013
И мы хотим добавить к этому объекту 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);
Когда мы хотим объединить свойства двух объектов, это наиболее удобные варианты:
Object.assign()
, принимает целевой объект в качестве аргумента и один или несколько исходных объектов и объединяет их вместе. Например: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()
более динамичен, потому что у нас есть доступ ко всем объектам, которые передаются в качестве аргументов, и мы можем манипулировать ими до того, как они будут назначены новому объекту.Вы можете создать класс с ответом @ 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, комментарии приветствуются. Работает для меня.
Два наиболее часто используемых способа, уже упомянутых в большинстве ответов
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
});
Этот метод полезен, когда вы хотите иметь больший контроль при определении свойства. Определенное свойство может быть установлено как перечисляемое, настраиваемое и доступное для записи пользователем.
В вашем примере показан объект, а не массив. В этом случае предпочтительный способ добавить поле к объекту - просто присвоить ему поле, например:
arr.key3 = value3;
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 } ]
поддерживается большинством браузеров и проверяет, доступен ли ключ объекта или нет, если он доступен, он переопределяет существующее значение ключа и недоступен strong> это добавить ключ со значением
пример 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 'объект:
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
Либо 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>
Краткий и элегантный способ в следующей спецификации Javascript (кандидатский этап 3):
obj = { ... obj, ... { key3 : value3 } }
Более подробное обсуждение можно найти в Распространение объекта и Object.assign и на Д-р. Сайт Акселя Раушмайерса.
Он уже работает в node.js, начиная с выпуска 8.6.0.
Vivaldi, Chrome, Opera и Firefox в последних выпусках также знают эту функцию, но Mirosoft не знает этого до сегодняшнего дня, ни в Internet Explorer, ни в Edge.
Мы можем добавить пару ключ / значение к объекту 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);
Вы можете добавить это так:
arr['key3'] = value3;
или так:
arr.key3 = value3;
Ответы, предлагающие ввести объект с помощью переменной key3
, будут работать, только если значение key3
было 'key3'
.
Согласно Аксессуарам собственности, определенным в 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) в обозначении скобок.
Мы тоже можем это сделать.
var myMap = new Map();
myMap.set(0, 'my value1');
myMap.set(1, 'my value2');
for (var [key, value] of myMap) {
console.log(key + ' = ' + value);
}
Вы можете создать новый объект, используя синтаксис {[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
Оператор распространения - это полезный и быстрый синтаксис для добавления элементов в массивы, объединения массивов или объектов и распределения массива по аргументам функции. Теперь в 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() //
Чтобы добавить пару "ключ-значение" к объекту, чтобы for in работал с этим элементом, сначала выполните следующие действия:
var nwrow = {'newkey': 'value' };
for(var column in row){
nwrow[column] = row[column];
}
row = nwrow;
Лучший способ добиться того же указан ниже:
function getKey(key) {
return `${key}`;
}
var obj = {key1: "value1", key2: "value2", [getKey('key3')]: "value3"};
//console.log(obj);
Поскольку это вопрос прошлого, но проблема настоящего. Предложил бы еще одно решение: просто передайте ключ и значения функции, и вы получите объект карты.
var map = {};
function addValueToMap(key, value) {
map[key] = map[key] || [];
map[key].push(value);
}