Додавання елементів до об'єкта


222

Мені потрібно заповнити файл json, тепер у мене є щось подібне:

{"element":{"id":10,"quantity":1}}

І мені потрібно додати ще один «елемент». Першим моїм кроком є ​​введення цього json у тип Object за допомогою cart = JSON.parse, тепер мені потрібно додати новий елемент. Я вважав, що треба використовувати, cart.pushщоб додати ще один елемент, я спробував це:

var element = {};
element.push({ id: id, quantity: quantity });
cart.push(element);

Але у мене з'явилася помилка "Об'єкт не має натискання методу", коли я намагаюся це зробити element.push, і я думаю, що я роблю щось ДУЖЕ неправильно, тому що я ніде не кажу "елемент".

Як я можу це зробити?

Редагувати: вибачте за все, у мене було багато плутанини в голові.

Я думав, що можу отримати лише тип об'єкта, коли беру дані JSON.parse, але я отримую те, що я вкладаю в JSON в першу чергу.

Поставивши масив замість об’єкта, вирішив мою проблему, я також використав безліч пропозицій, дякую всім!



Object.assign (ціль, джерело); може використовуватися для копіювання всіх властивостей з вихідного об'єкта в цільовий об'єкт.
Девід Спектор

Відповіді:


287

Ваш елемент не є масивом, проте ваш кошик повинен бути масивом, щоб підтримувати багато об'єктних елементів. Приклад коду:

var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push(element);

Якщо ви хочете, щоб кошик був масивом об'єктів у формі, { element: { id: 10, quantity: 1} }виконайте:

var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push({element: element});

JSON.stringify() в коментарі згадувалося як стурбованість:

>> JSON.stringify([{a: 1}, {a: 2}]) 
      "[{"a":1},{"a":2}]" 

2
дякую, але зараз моя кошик - це не масив, і я не можу зробити cart.push :( мені потрібен об’єкт, щоб використовувати JSON.stringify (cart) після цієї операції
HypeZ

@HypeZ Ви все одно можете поширити корзину, якщо це масив об'єктів.
Костянтин Дінев

ще раз дякую вам! Але мої базові дані - це об'єкт типу причини "cart = JSON.parse (jsonfile)" на початку .. Я не думаю, що я повинен сприймати json як об'єкт, перетворювати його в масив, додавати елемент, строфікувати ..
HypeZ

чомусь мій об’єкт заповнюється лише останнім елементом. наприклад, у мене є 4 різні елементи, але в об'єкті всі 4 елементи = останнє значення, яке я знайшов, це створити елемент = {}; всередині для, тоді її робота належним чином
Городецький Димитрій

1
@GorodeckijDimitrij Якщо ви повторно використовуєте один і той же об’єкт елемента і повторно заселяєте його ключі з новими значеннями, ви будете змінювати один і той же екземпляр елемента, натискаючи його знову і знову в масив. Просто використовуйте новий елемент для кожного елемента, який ви додаєте, і це зроблено в області for-циклу.
Костянтин Дінев

160

З цим рядом

var element = {};

ви визначаєте elementяк звичайний об’єкт. Власний об’єкт JavaScript не має push()методу. Щоб додати нові елементи до звичайного об’єкта, використовуйте цей синтаксис:

element[ yourKey ] = yourValue;

З іншого боку, ви можете визначити elementяк масив, використовуючи

var element = [];

Потім ви можете додати елементи за допомогою push().


4
element[ yourKey ] = yourValue;це найкращий спосіб додати елемент до об'єкта.
Прамеш Байрачаря

Але ви не можете надати порядок доданого елемента в об'єкті з елементом [yourKey] = yourValue;
RollerCosta

2
@Pramesh Bajracharya Це не додає значення елементу, він просто встановлює поточний елемент цьому значенню.
Hasen

1
@sommesh як ти хочеш зберегти дублікат? ви могли зробитиelement[ yourkey ] = [ element{yourkey], yourNewValue ];
Сірко

1
@sommesh це дасть вам дублікат ключа, що за визначенням неможливо в об’єкті JS. ви можете зібрати кілька значень лише для одного ключа, як я показав раніше.
Сірко

21

Якщо візок повинен зберігатися як об’єкт, а не масив (Хоча я б рекомендував зберігати як []), ви завжди можете змінити структуру, щоб використовувати ідентифікатор як ключ:

var element = { quantity: quantity };
cart[id] = element;

Це дозволяє додавати в кошик кілька предметів так:

cart["1"] = { quantity: 5};
cart["2"] = { quantity: 10};

// Cart is now:
// { "1": { quantity: 5 }, "2": { quantity: 10 } }

дякую, але мій кошик повинен бути об’єктом, а не масивом :(
HypeZ

3
Однією з причин використовувати такий об’єкт, якщо вам потрібно видалити елементи. Видалити ключ з об’єкта набагато простіше, ніж видалити ключ з масиву.
bryc

Якщо коментар масиву HypeZ когось відкидає, відповідь Крейга не додає масив, дужки [] використовуються для доступу до ресурсу. Перевірте це на jsfiddle і прочитайте про це тут, на Mozilla, і ось чудова стаття в Digital Ocean, на яку я б хотіла, що я натрапила давно.
Hastig Zusammenstellen

12

Щоб додати до об’єкта використання Object.assign

var ElementList ={}

function addElement (ElementList, element) {
    let newList = Object.assign(ElementList, element)
    return newList
}
console.log(ElementList)

Вихід:

{"елемент": {"id": 10, "кількість": 1}, "елемент": {"id": 11, "кількість": 2}}


Це, мабуть, найбільш функціональний спосіб робити речі, але новачок розробник javascript, мабуть, цього не зрозуміє.
codeninja

1
Я спробував це, але він буде переосмислювати існуючий елемент, тому що обидва мають однакове ім'я element, тому він матиме лише останній елемент.
Haritsinh Gohil

6

ви повинні написати var element = [];
в JavaScript {}- це порожній об'єкт і []є порожнім масивом.


6
cart.push({"element":{ id: id, quantity: quantity }});

4
не можете зробити cart.push, тому що кошик зараз є об'єктом! :(
HypeZ

якась конкретна причина, чому його є об'єктом, а не масивом?
Кріс

тому що я отримав його з "cart = JSON.parse (jsonfile)", і він дає об'єкт
HypeZ

6

Я читав щось, пов’язане з цією спробу, якщо це корисно.

1.Визначте функцію натискання всередині об'єкта.

let obj={push:function push(element){ [].push.call(this,element)}};

Тепер ви можете натискати елементи, як масив

obj.push(1)
obj.push({a:1})
obj.push([1,2,3])

Це створить цей об’єкт

obj={
 0: 1
 1: {a: 1}
 2: (3) [1, 2, 3]
 length: 3
}

Зауважте, що елементи додаються з індексами, а також бачите, що до об'єкта додано нове властивість довжини. Це також буде корисно знайти довжину об'єкта. Це працює через загальний характер push()функції


5
function addValueInObject(object, key, value) {
    var res = {};
    var textObject = JSON.stringify(object);
    if (textObject === '{}') {
        res = JSON.parse('{"' + key + '":"' + value + '"}');
    } else {
        res = JSON.parse('{' + textObject.substring(1, textObject.length - 1) + ',"' + key + '":"' + value + '"}');
    }
    return res;
}

цей код працює.


3

Спробуйте це:

var data = [{field:"Data",type:"date"},  {field:"Numero",type:"number"}];

var columns = {};

var index = 0;

$.each(data, function() {

    columns[index] = {
        field : this.field,
        type : this.type
    };

    index++;
});

console.log(columns);

3

Додавання нових елементів ключа / пари в оригінальний об'єкт:

const obj = { a:1, b:2 }
const add = { c:3, d:4, e: ['x','y','z'] }

Object.entries(add).forEach(([key,value]) => {obj[key] = value })

нове значення:

{a: 1, b: 2, c: 3, d: 4, e: ["x", "y", "z"] }

2

Якщо хтось приходить шукати створити подібний JSON, просто без використання cart як масив, ось що:

У мене є масив об'єктів myArrяк:

var myArr = [{resourceType:"myRT",
            id: 1,
            value:"ha"},
            {resourceType:"myRT",
            id: 2,
            value:"he"},
            {resourceType:"myRT",
            id: 3,
            value:"Li"}];

і я спробую створити JSON із такою структурою:

{
 "1":{"resourceType":"myRT","id":"1","value":"ha"},
 "2":{"resourceType":"myRT","id":"2","value":"he"},
 "3":{"resourceType":"myRT","id":"3","value":"Li"}
}

ви можете просто зробити-

var cart = {};
myArr.map(function(myObj){
                    cart[myObj.id]= myObj;
                    });

Як ви додаєте значення тій новій створеній вами структурі JSON?
Джуд Фернандес

1
@JudeFernandes - cart[key]=valueце головна карта значень. Зробіть заявку, якщо відповідь була корисною. Дякую!
Саад Патель

2

Для тих, хто ще шукає рішення, я думаю, що об'єкти повинні були зберігатися в масиві, як ...

var element = {}, cart = [];
element.id = id;
element.quantity = quantity;
cart.push(element);

Тоді, коли ви хочете використовувати елемент як об'єкт, ви можете це зробити ...

var element = cart.find(function (el) { return el.id === "id_that_we_want";});

Помістіть змінну на "id_that_we_want" і надайте їй ідентифікатор елемента, який ми хочемо з нашого масиву. Повертається об'єкт "елем". Звичайно, нам не потрібно ідентифікувати, щоб знайти об’єкт. Ми можемо використовувати будь-яку іншу власність, щоб зробити цю знахідку.


1
 function addValueInObject(value, object, key) {

        var addMoreOptions = eval('{"'  + key + '":' +  value + '}');

        if(addMoreOptions != null) {
            var textObject = JSON.stringify(object);
            textObject = textObject.substring(1,textObject.length-1);
            var AddElement = JSON.stringify(addMoreOptions);
            object = eval('{' + textObject +','+  AddElement.substring(1,AddElement.length-1) + '}');
        }
        return object;
    }

addValueInObject('sdfasfas', yourObject, 'keyname');

АБО:

var obj = {'key':'value'};

obj.key2 = 'value2';

Хоча це спосіб досягти однакових результатів, це рішення не є охайним.
warunapww

1

push - це метод масивів, тому для об'єкта ви можете отримати індекс останнього елемента, і ви, ймовірно, можете виконати ту саму роботу, що і push для об'єкта, як нижче

var lastIndex = Object.keys(element)[Object.keys(element).length-1];

потім додайте об'єкт до нового індексу елемента

element[parseInt(lastIndex) +1] = { id: id, quantity: quantity };

1

якщо ви не плануєте робити цикл в JS, наприклад, перейдіть до PHP, щоб зробити цикл для вас

let decision = {}
decision[code+'#'+row] = event.target.value

ця концепція може трохи допомогти


1

Це старе питання, і все-таки сьогодні найкращою практикою є використання Object.defineProperty

const object1 = {};

Object.defineProperty(object1, 'property1', {
  value: 42,
  writable: false
});

object1.property1 = 77;
// throws an error in strict mode

console.log(object1.property1);
// expected output: 42
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.