¿Cómo puedo agregar un par clave / valor a un objeto JavaScript?

1383

Aquí está mi objeto literal:

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

¿Cómo puedo añadir campo key3con value3el objeto?

James Skidmore
fuente
2
Bueno, todo el problema de las matrices asociativas en JS es extraño, porque puedes hacer esto ... dreaminginjavascript.wordpress.com/2008/06/27/…
Nosredna
@Nosredna: el punto es que no hay arreglos asociativos en javascript. En ese artículo, está agregando propiedades de objeto a un objeto de matriz, pero estas no son realmente parte de la 'matriz'.
UpTheCreek
¿Hay alguna manera de establecer condicionalmente la clave: pares de valores en un objeto literal con futuras implementaciones de ES +?
Con Antonakos

Respuestas:

2253

Hay dos formas de agregar nuevas propiedades a un objeto:

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

Usando notación de punto:

obj.key3 = "value3";

Usando la notación de corchetes:

obj["key3"] = "value3";

El primer formulario se usa cuando conoce el nombre de la propiedad. La segunda forma se usa cuando el nombre de la propiedad se determina dinámicamente. Como en este ejemplo:

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

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

Se puede construir una matriz de JavaScript real usando:

La notación literal de la matriz:

var arr = [];

La notación de constructor de matriz:

var arr = new Array();
Ionuț G. Stan
fuente
44
obj es un objeto. La parte entre (e incluyendo) las llaves es el objeto literal. obj no es un objeto literal.
Nosredna
24
¿Qué pasa si la clave es un número? obj.123 = 456 no funciona. obj [123] = 456 funciona
axel freudiger
10
@axelfreudiger, de hecho, cualquier cosa que no sea sintácticamente un identificador de variable válido debe usarse con notación de corchetes.
Ionuț G. Stan
1
@KyleKhalafObject.keys({"b": 1, "c": 3, "a": 2}).sort().forEach(console.log);
Ionuț G. Stan
2
@JohnSmith la lengthpropiedad no está establecida porque no es una matriz, es un objeto / mapa / diccionario.
Ionuț G. Stan
348

Respuesta del año 2017: Object.assign()

Object.assign (dest, src1, src2, ...) combina objetos.

Se sobrescribe destcon propiedades y valores de (sin importar cuántos) objetos fuente, luego regresa dest.

El Object.assign()método se utiliza para copiar los valores de todas las propiedades propias enumerables de uno o más objetos de origen a un objeto de destino. Devolverá el objeto de destino.

Ejemplo en vivo

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

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

Respuesta del año 2018: operador de propagación de objetos {...}

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

De MDN :

Copia propiedades enumerables propias de un objeto proporcionado en un nuevo objeto.

La clonación superficial (excluyendo el prototipo) o la fusión de objetos ahora es posible usando una sintaxis más corta que Object.assign().

Nótese que los Object.assign()disparadores set mientras que la sintaxis de propagación no lo hace.

Ejemplo en vivo

Funciona en Chrome actual y Firefox actual. Dicen que no funciona en Edge actual.

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

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

Respuesta año 2019

Operador de asignación de objetos += :

obj += {key3: "value3"};

Vaya ... me dejé llevar. El contrabando de información del futuro es ilegal. Debidamente oscurecido!

7vujy0f0hy
fuente
34
obj + = suena increíble
Mehrdad Shokri
2
phpstorm recomienda usar consty, en letlugar de var, ¿debería ser esa la forma 2018?
Jim Smith
@ jimsmith: No estoy seguro de por qué estás diciendo esto aquí. Quieres mi opinion La ventaja de un intérprete es la capacidad de cambiar todo en vivo en la consola. No me gusta constporque elimina esa ventaja. Cada vez que lo usaba, obstaculizaba el desarrollo.
7vujy0f0hy
estamos en 2019, ¿eso significa que el operador de asignación ya se puede usar para reemplazar al operador de spread?
Mr-Programs
2
Un verdadero programador valorará un poco de diversión para proporcionar alivio a una profesión siempre estresante. Tu Year 2019 answer ... Opps ...porción merece un agradecimiento, me alegraste el día . Mejor respuesta +1
ColinWa
89

Me he encariñado con LoDash / Underscore cuando escribo proyectos más grandes.

Agregar por obj['key']o obj.keyson todas respuestas de JavaScript puro y sólido. Sin embargo, las bibliotecas LoDash y Underscore proporcionan muchas funciones convenientes adicionales cuando se trabaja con objetos y matrices en general.

.push()es para matrices , no para objetos .

Dependiendo de lo que esté buscando, hay dos funciones específicas que pueden ser agradables de utilizar y brindan una funcionalidad similar a la de la sensación arr.push(). Para obtener más información, consulte los documentos, que tienen algunos excelentes ejemplos allí.

_.merge (solo Lodash)

El segundo objeto sobrescribirá o agregará al objeto base. undefinedlos valores no se copian.

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

El segundo objeto sobrescribirá o agregará al objeto base. undefinedserá copiado

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}

_defectos

El segundo objeto contiene valores predeterminados que se agregarán al objeto base si no existen. undefinedlos valores se copiarán si la clave ya existe.

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

Además, puede valer la pena mencionar jQuery.extend, funciona de manera similar a _.merge y puede ser una mejor opción si ya está usando jQuery.

El segundo objeto sobrescribirá o agregará al objeto base. undefinedlos valores no se copian.

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

Vale la pena mencionar el Object.assign ES6 / ES2015, funciona de manera similar a _.merge y puede ser la mejor opción si ya está utilizando un polyfill ES6 / ES2015 como Babel si desea rellenarlo usted mismo .

El segundo objeto sobrescribirá o agregará al objeto base. undefinedserá copiado

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}
Señor Nathan Stassen
fuente
Creo que _.merge es ahora _.extend (destino, otros)
AD
Ah, tienes razón, _.extendes un alias más universal ya que la biblioteca de subrayado todavía extendno está usando merge. Actualizaré mi respuesta.
Señor.Nathan Stassen
66

Puede usar cualquiera de estos (siempre que la tecla 3 sea la tecla aguda que desea usar)

arr[ 'key3' ] = value3;

o

arr.key3 = value3;

Si key3 es una variable, entonces debe hacer:

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

Después de esto, solicitar arr.a_keydevolvería el valor de value3, un literal 3.

seth
fuente
77
Esto no es una matriz sino un objeto. Las matrices JS se indexan solo por entero. Intente hacer arr.length y devolverá 0. Más información sobre esto: less-broken.com/blog/2010/12/…
DevAntoine
El enlace de @ DevAntoine no es accesible. Si desea obtener la "longitud" de este tipo de matriz, use: Object.keys (your_array) .length Más información sobre este problema, consulte: stackoverflow.com/questions/21356880/array-length-returns-0
Thế Anh Nguyễn
También se podría sobrescribir la propiedad de longitud de la matriz que están creando. Establecer var myarray ["length"] = numArrayFields resuelve este problema por mí. Suponiendo que está realizando un seguimiento de la cantidad de campos que está agregando a su matriz de alguna manera.
John Smith
30
arr.key3 = value3;

porque su arr no es realmente una matriz ... Es un objeto prototipo. La matriz real sería:

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

Pero todavía no está bien. En realidad debería ser:

var arr = [{key: key1, value: value1}, {key: key2, value: value2}];
Robert Koritnik
fuente
25
var employees = []; 
employees.push({id:100,name:'Yashwant',age:30});
employees.push({id:200,name:'Mahesh',age:35});
Vicky
fuente
22
Esto es para matrices, no para objetos.
Roly
12

Simplemente agregando propiedades:

Y queremos agregar prop2 : 2a este objeto, estas son las opciones más convenientes:

  1. Operador de punto: object.prop2 = 2;
  2. corchetes: object['prop2'] = 2;

Entonces, ¿cuál usamos entonces?

El operador de punto es una sintaxis más limpia y se debe usar de manera predeterminada (imo). Sin embargo, el operador de puntos no es capaz de agregar claves dinámicas a un objeto, lo que puede ser muy útil en algunos casos. Aquí hay un ejemplo:

const obj = {
  prop1: 1
}

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

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

console.log(obj);

Fusionar objetos:

Cuando queremos fusionar las propiedades de 2 objetos, estas son las opciones más convenientes:

  1. Object.assign(), toma un objeto de destino como argumento y uno o más objetos de origen y los fusionará. Por ejemplo:

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

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

console.log(object2);

  1. Operador de propagación de objetos ...

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

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

console.log(newObj);

¿Cuál usamos?

  • La sintaxis de propagación es menos detallada y debe usarse como una imo predeterminada. No olvides transpilar esta sintaxis a sintaxis que es compatible con todos los navegadores porque es relativamente nueva.
  • Object.assign() es más dinámico porque tenemos acceso a todos los objetos que se pasan como argumentos y podemos manipularlos antes de que se asignen al nuevo Objeto.
Willem van der Veen
fuente
1
En la parte superior de tu publicación: esos no son corchetes sino corchetes.
Bram Vanroy el
11

Sé que ya hay una respuesta aceptada para esto, pero pensé que documentaría mi idea en alguna parte. Por favor, [la gente] no dude en hacer agujeros en esta idea, ya que no estoy seguro de si es la mejor solución ... pero acabo de armar esto hace unos minutos:

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

Lo utilizarías de esta manera:

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

Como la función prototipo está regresando this, puede continuar encadenando .pushhasta el final de su objvariable:obj.push(...).push(...).push(...);

Otra característica es que puede pasar una matriz u otro objeto como valor en los argumentos de la función de inserción. Vea mi violín para un ejemplo de trabajo: http://jsfiddle.net/7tEme/

microondas
fuente
tal vez esta no sea una buena solución, parece que recibo errores en jquery1.9: lo TypeError: 'undefined' is not a function (evaluating 'U[a].exec(s)')cual es extraño porque funciona en jsfiddle incluso con jquery1.9
sadmicrowave
3
No debe extender Object.prototype; esto rompe la función de "objeto como tablas hash" de JavaScript (y posteriormente muchas bibliotecas como la API de Google Maps JS). Ver discusión: stackoverflow.com/questions/1827458/…
Justin R.
11

Actuación

Hoy 2020.01.14 realizo pruebas en MacOs HighSierra 10.13.6 en Chrome v78.0.0, Safari v13.0.4 y Firefox v71.0.0, para las soluciones elegidas. Divido las soluciones en mutable (primera letra M) e inmutable (primera letra I). También proporciono algunas soluciones inmutables (IB, IC, ID / IE) aún no publicadas en las respuestas a esta pregunta

Conclusiones

  • las soluciones mutables más rápidas son mucho más rápidas que las inmutables más rápidas (> 10x)
  • enfoque mutable clásico como obj.key3 = "abc"(MA, MB) es el más rápido
  • para soluciones inmutables, {...obj, key3:'abc'}y Object.assign(IA, IB) son más rápidas
  • Sorprendentemente, hay soluciones inmutables más rápido que algunas soluciones mutables para cromo (MC-IA) y safari (MD-IB)

ingrese la descripción de la imagen aquí

Detalles

En el fragmento a continuación hay una solución probada presentada, puede realizar una prueba previa en su máquina AQUÍ

ingrese la descripción de la imagen aquí

Kamil Kiełczewski
fuente
9

Puedes crear una clase con la respuesta de @ Ionuț G. Stan

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

Crear un nuevo objeto con la última clase:

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

Imprimir el objeto

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

Imprimir una llave

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

Soy novato en javascript, los comentarios son bienvenidos. Funciona para mi.

Eduen Sarceno
fuente
7

Dos formas más utilizadas ya mencionadas en la mayoría de las respuestas

obj.key3 = "value3";

obj["key3"] = "value3";

Una forma más de definir una propiedad es usar 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
});

Este método es útil cuando desea tener más control al definir la propiedad. La propiedad definida se puede establecer como enumerable, configurable y escribible por el usuario.

Sanchay Kumar
fuente
6

Su ejemplo muestra un objeto, no una matriz. En ese caso, la forma preferida de agregar un campo a un Objeto es simplemente asignarlo, así:

arr.key3 = value3;
bdukes
fuente
6

compatible con la mayoría de los navegadores, y verifica si la clave de objeto está disponible o no, si está disponible , anula el valor de clave existente y no está disponible , agrega clave con valor

Ejemplo 1

let my_object = {};

// now i want to add something in it  

my_object.red = "this is red color";

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

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

ejemplo 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" 
//            }   
//       }
Abhishek Garg
fuente
5

En caso de que tenga varios literales de objeto anónimos dentro de un objeto y desee agregar otro objeto que contenga pares clave / valor, haga lo siguiente:

Firebug 'el objeto:

console.log(Comicbook);

devoluciones:

[Objeto {nombre = "Spiderman", valor = "11"}, Objeto {nombre = "Marsipulami", valor = "18"}, Objeto {nombre = "Garfield", valor = "2"}]

Código:

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

se agregará Object {name="Peanuts", value="12"}al objeto Comicbook

stevek
fuente
Explicó bien y con claridad otra opción que es más adecuada para direccionar objetos con una propiedad de identificación o nombre y luego asignarla mientras agrega, una buena. especialmente cuando tiene o podría tener en el futuro más accesorios, se aplicará el mismo método, simplemente ponga otro coma y esté listo para el cambio en los planes
Avia Afer
5

Ya sea obj['key3'] = value3o obj.key3 = value3agregará el nuevo par al obj.

Sin embargo, sé que jQuery no se mencionó, pero si lo está utilizando, puede agregar el objeto $.extend(obj,{key3: 'value3'}). P.ej:

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]) combina el contenido de dos o más objetos en el primer objeto.

Y también permite adiciones / modificaciones recursivas con $.extend(true,object1,object2);:

Brazo
fuente
5

Una forma corta y elegante en la próxima especificación de Javascript (candidato etapa 3) es:

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

Se puede encontrar una discusión más profunda en Object spread vs Object.assign y en el sitio del Dr. Axel Rauschmayers .

Funciona ya en node.js desde la versión 8.6.0.

Vivaldi, Chrome, Opera y Firefox en versiones actualizadas también conocen esta característica, pero Mirosoft no lo hace hasta hoy, ni en Internet Explorer ni en Edge.

xyxyber
fuente
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);
    });

Salida como esta: -

[ { 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 } ]
Sayed Tauseef Haider Naqvi
fuente
4

Puedes agregarlo de esta manera:

arr['key3'] = value3;

o de esta manera:

arr.key3 = value3;

Las respuestas que sugieren introducir el objeto con la variable key3solo funcionarían si el valor de key3fue 'key3'.

wombleton
fuente
4

Según los descriptores de acceso a propiedades definidos en ECMA-262 ( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf , P67), hay dos formas de agregar propiedades a existe un objeto Todos estos dos modos, el motor de Javascript los tratará igual.

La primera forma es usar la notación de puntos:

obj.key3 = value3;

Pero de esta manera, debe usar un IdentifierName después de la notación de puntos.

La segunda forma es usar la notación de corchetes:

obj["key3"] = value3;

y otra forma:

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

De esta manera, podría usar una Expresión (incluir IdentifierName ) en la notación de corchetes.

Chen Yang
fuente
4

Podemos hacer esto de esta manera también.

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

Ya que es una cuestión del pasado pero el problema del presente. Sugeriría una solución más: simplemente pase la clave y los valores a la función y obtendrá un objeto de mapa.

var map = {};
function addValueToMap(key, value) {
map[key] = map[key] || [];
map[key].push(value);
}
PPing
fuente
2
Esto no parece estar relacionado con la pregunta que se hizo en absoluto.
Quentin
0

Para anteponer un par clave-valor a un objeto, para que for for funcione con ese elemento primero haga esto:

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

La mejor manera de lograr lo mismo se indica a continuación:

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

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

//console.log(obj);
sgajera
fuente
0

Puede crear un nuevo objeto utilizando la {[key]: value}sintaxis:

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 sintaxis anterior, ahora puede usar la sintaxis de propagación {...foo, ...bar}para agregar un nuevo objeto sin mutar su valor anterior:

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

Jonathan Stellwag
fuente