2013-05-07 2 views
6

Я хочу добавить несколько атрибутов к существующему объекту с существующими атрибутами. Есть ли более краткий путь, чем одна строка за новый атрибут?Добавить несколько атрибутов в существующий объект js

myObject.name = 'don'; 
myObject.gender = 'male'; 

Все на MDN показывает, как сделать новые объекты с помощью обозначений квадратными скобками, но не существующие объекты: библиотеки https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Working_with_Objects

+1

Вы coul d создайте функцию, которая получает ваш объект и объект с новыми реквизитами/значениями, и перечисляет новый объект, обновляя старый. Это будет немного более кратким. 'update (obj, {name:" don ", gender:" male "})' –

ответ

5

От How can I merge properties of two JavaScript objects dynamically?

var obj2 = {name: 'don', gender: 'male'}; 
for (var attrname in myobject) { myobject[attrname] = obj2[attrname]; } 

EDIT

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

//Extend the protype so you can make calls on the instance 
Object.prototype.merge = function(obj2) { 
    for (var attrname in obj2) { 
     this[attrname] = obj2[attrname]; 
    } 
    //Returning this is optional and certainly up to your implementation. 
    //It allows for nice method chaining. 
    return this; 
}; 
//Append to the object constructor function so you can only make static calls 
Object.merge2 = function(obj1, obj2) { 
    for (var attrname in obj2) { 
     obj1[attrname] = obj2[attrname]; 
    } 
    //Returning obj1 is optional and certainly up to your implementation 
    return obj1; 
}; 

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

var myObject1 = { One: "One" }; 
myObject1.merge({ Two: "Two" }).merge({ Three: "Three" }); 
//myObject1 is { One: "One", Two: "Two", Three: "Three", merge: function } 


var myObject2 = Object.merge2({ One: "One" }, { Two: "Two" }); 
Object.merge2(myObject2, { Three: "Three" }); 
//myObject2 is { One: "One", Two: "Two", Three: "Three" } 

Примечание: Вы, конечно, могли бы реализовать гибкую стратегию слияния конфликта в зависимости от ваших потребностей ,

3

Использование JQuery

jQuery.extend(myObject, { name : 'don', gender : 'male' }); 
+0

К сожалению, нельзя использовать jQuery. (Как сильно неудачный) Хотя это выглядит супер чистым ... –

+0

Этот вопрос не помечен [tag: jQuery]. –

+0

jQuery только для расширения объекта глупо. –

4

Иногда я делаю это так:

var props = { 
    name : 'don', 
    gender : 'male', 
    age : 12, 
    other : false 
}; 
for(var p in props) myObject[p] = props[p]; 
2

В ECMAScript 5 вы можете сделать нас defineProperties:

Object.defineProperties(myobject, { 
    name: { 
    value: 'don' 
    }, 
    gender: { 
    value: 'male' 
    } 
}); 
+0

К сожалению, этот синтаксис довольно многословный, что делает его еще дольше, чем оригинал, который OP надеется оптимизировать. –

+0

Да, я думаю, вы правы, это больше подходит, если вы хотите защитить от мутации ваших объектов. Хе-хе, я всегда это делаю ... = P – JimmyRare

+0

Согласен. Это приятная особенность, просто неуклюжая. –

-1

Метод .push() работал для меня на проблемы в классе Free Code Camp , Я не знаю, насколько это практично в реальном приложении, но оно прошло тест. Вот что было на месте:

var myMusic = [ 
    { 
    "artist": "Billy Joel", 
    "title": "Piano Man", 
    "release_year": 1973, 
    "formats": [ 
     "CS", 
     "8T", 
     "LP" ], 
    "gold": true 
    }]; 

Вот что я вошел:

myMusic.push({ 
    "artist": "Metallica", 
    "title": "Ride the Lightning", 
    "release_year" : 1984, 
    "formats": [ 
     "CS", 
     "8T", 
     "LP" ] 
    } // Add record here 
); 

Вот вывод, что он отображается:

[ { 
    "artist": "Billy Joel", 
    "title": "Piano Man", 
    "release_year": 1973, 
    "formats": [ 
     "CS", 
     "8T", 
     "LP" ], 
    "gold": true 
    },{ 
    "artist": "Metallica", 
    "title": "Ride the Lightning", 
    "release_year" : 1984, 
    "formats": [ 
     "CS", 
     "8T", 
     "LP" ] 
    }] 
+0

Это было как ответ.В исходном посте было задано вопрос, есть ли способ добавить сразу несколько объектов к существующему объекту. –

+3

wait, но это добавление дополнительного объекта в массив. не то же самое. – Julix

3

В ES6/ES2015 можно использовать метод Object.assign

let obj = {key1: true}; 
console.log('old obj: ', obj); 
let newObj = {key2: false, key3: false}; 

Object.assign(obj, newObj); 
console.log('modified obj: ', obj); 
Смежные вопросы