Nesneye eleman ekleme


222

Bir json dosyasını doldurmak gerekiyor, şimdi böyle bir şey var:

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

Ve başka bir "element" eklemem gerekiyor. İlk adım kullanarak json kullanarak bir nesne türü cart = JSON.parse, şimdi yeni öğe eklemeniz gerekir. cart.pushBaşka bir eleman eklemek için kullanmalıydım , bunu denedim:

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

Ama ben yapmaya çalıştığınızda "Nesne hiçbir yöntemi itme" hata var element.pushve ben her yerde "eleman" söylemiyorum çünkü ÇOK yanlış bir şey yapıyorum düşünüyorum.

Bunu nasıl yapabilirim?

Düzenleme: üzgünüm kafamda bir sürü kafa karışıklığı vardı.

Veri alırken yalnızca nesne türünü alabileceğimi düşündüm JSON.parse, ama ilk etapta JSON'a koyduğum şeyi aldım.

Nesne yerine dizi koymak sorunumu çözdü, ben de burada var birçok öneri kullandım, hepinize teşekkürler!



Object.assign (hedef, kaynak); kaynak nesneden hedef nesneye tüm özellikleri kopyalamak için kullanılabilir.
David Spector

Yanıtlar:


287

Öğeniz bir dizi değil, ancak birçok öğe nesnesini desteklemek için sepetinizin bir dizi olması gerekir. Kod örneği:

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

Sepetin formdaki bir nesne dizisi olmasını istiyorsanız, şunları { element: { id: 10, quantity: 1} }gerçekleştirin:

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

JSON.stringify() yorumda bir endişe olarak bahsedildi:

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

2
teşekkür ederim, ama benim sepeti şimdi bir dizi değildir ve ben cart.push yapamam :( i bu işlemden sonra JSON.stringify (sepeti) kullanmak için bir nesneye ihtiyacım var
HypeZ

@HypeZ Bir nesne dizisiyse, sepeti yine de dize edebilirsiniz.
Konstantin Dinev

tekrar teşekkürler! Ama benim temel veri başında "cart = JSON.parse (jsonfile)" nesne türü neden .. i bir nesne olarak json almak, dizi, öğe eklemek, stringify dönüştürmek gerektiğini sanmıyorum ..
HypeZ

bir nedenden ötürü, nesnem yalnızca son elemanla dolu oluyor. örneğin 4 farklı öğe var, ama bir nesnede tüm 4 element = bulduğum son değer çözüm element = {} oluşturmak olduğunu; için, sonra düzgün çalışması
Gorodeckij Dimitrij

1
@GorodeckijDimitrij Aynı öğe nesnesini yeniden kullanıyorsanız ve bu anahtarları yeni değerlerle yeniden doldurursanız, öğeyi bir ve aynı örneğini değiştirerek tekrar tekrar bir diziye itersiniz. Eklediğiniz her öğe için yeni bir öğe nesnesi kullanın; bu, for-loop kapsamında yaptığınız şeydir.
Konstantin Dinev

162

Bu sıra ile

var element = {};

elementdüz bir nesne olarak tanımlayabilirsiniz . Yerel JavaScript nesnesinin push()yöntemi yok . Düz bir nesneye yeni öğeler eklemek için bu sözdizimini kullanın:

element[ yourKey ] = yourValue;

Öte yandan şunu elementkullanarak dizi olarak tanımlayabilirsiniz

var element = [];

Ardından kullanarak öğeler ekleyebilirsiniz push().


4
element[ yourKey ] = yourValue;bir nesneye öğe eklemenin en iyi yoludur.
Pramesh Bajracharya

Ancak [yourKey] = yourValue öğesiyle nesneye eklenen öğenin sırasını veremezsiniz;
RollerCosta

2
@Pramesh Bajracharya Öğeye değer EKLEMEZ, sadece geçerli öğeyi bu değere ayarlar.
Hasen

1
@sommesh kopyayı nasıl tutmak istersiniz? yapabilirsinelement[ yourkey ] = [ element{yourkey], yourNewValue ];
Sirko

1
@sommesh bu, tanımı gereği bir JS nesnesinde mümkün olmayan yinelenen bir anahtar verecektir. daha önce gösterdiğim gibi yalnızca bir anahtar için birden çok değer toplayabilirsiniz.
Sirko

21

Sepetin bir nesne olarak değil de dizi olarak saklanması gerekiyorsa ([] olarak saklamanızı tavsiye etsem de) kimliğini anahtar olarak kullanmak için her zaman yapıyı değiştirebilirsiniz:

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

Bu, alışveriş sepetine şu şekilde birden fazla öğe eklemenize olanak tanır:

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

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

teşekkür ederim, ancak benim sepeti bir dizi değil, bir nesne olması gerekir :(
HypeZ

3
Böyle bir nesneyi kullanmanın bir nedeni, öğeleri silmeniz gerektiğidir. Bir nesneden bir anahtarın silinmesi, bir diziden bir anahtarın silinmesinden çok daha kolaydır.
bryc

HypeZ'nin dizi yorumunun kimseyi atması durumunda, Craig'in cevabı bir dizi eklemez, parantez [] özelliğe erişmek için kullanılır. Burada jsfiddle üzerinde test edin ve Mozilla'da burada okuyun ve burada Digital Ocean'da uzun zaman önce rastlamak istediğim harika bir makale .
Hastig Zusammenstellen

12

Nesneye eklemek için Object.assign

var ElementList ={}

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

Çıktı:

{ "Eleman": { "id": 10, "miktar": 1}, "eleman": { "id": 11, "miktar": 2}}


Bu muhtemelen bir şeyler yapmanın en işlevsel yoludur, ancak yeni gelen bir javascript geliştiricisi muhtemelen bunu anlamayacaktır.
codeninja

1
denedim ama mevcut öğeyi geçersiz kılacaktır, çünkü her ikisi de aynı ada sahip element, bu yüzden sadece son öğeye sahip olacak.
Haritsinh Gohil

7

Yararlıysa bu denemeyle ilgili bir şey okuyordum.

1.Bir nesnenin içindeki bir itme işlevini tanımlayın.

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

Artık dizi gibi öğeleri itebilirsiniz

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

Bu, bu nesneyi üretecektir

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

Elementler endeksler ile eklenmiş ve aynı zamanda yeni bir uzunluk object.This eklenen özellik nesne too.This uzunluğunu bulmak için yararlı olacaktır olduğunu görüyoruz edilmektedir edin çünkü jenerik doğanın işleri push()fonksiyonu


6

var element = [];
Javascript yazmalısınız {}boş bir nesne ve []boş bir dizidir.


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

4
cart.push yapamam çünkü sepeti şimdi bir nesne! :(
HypeZ

herhangi bir nedeni onun dizi yerine bir nesne olmasıdır?
Cris

çünkü "cart = JSON.parse (jsonfile)" den aldım ve bir nesne veriyor
HypeZ

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;
}

bu kod çalıştı.


3

Bunu dene:

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

Orijinal nesneye yeni anahtar / çift öğeleri ekleme:

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

obj yeni değeri:

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

2

Herkes cartbir dizi olarak kullanmadan benzer bir JSON oluşturmak için geliyorsa , işte gidiyor:

Nesnelerin bir dizi var myArr:

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

ve aşağıdaki yapıya sahip bir JSON oluşturmaya çalışacağım:

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

basitçe yapabilirsin-

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

Oluşturduğunuz yeni JSON yapısına nasıl değer eklersiniz?
Jude Fernandes

1
@JudeFernandes cart[key]=valuetemelde bir anahtar değer haritasıdır. Cevabın yardımcı olup olmadığını oylayın. Teşekkürler!
Saad Patel

2

Hala bir çözüm arayan herkes için, ben nesneleri gibi bir dizide saklanmış olması gerektiğini düşünüyorum ...

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

Sonra bir nesneyi nesne olarak kullanmak istediğinizde bunu yapabilirsiniz ...

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

"İd_that_we_want" öğesine bir değişken koyun ve bu değişkene dizimizden istediğimiz öğenin kimliğini verin. Bir "elemnt" nesnesi döndürülür. Tabii ki nesneyi bulmak için bize kimlik vermek zorunda değiliz. Biz bulmak için başka bir özellik kullanabilirsiniz.


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');

VEYA:

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

obj.key2 = 'value2';

Bu aynı sonuçları elde etmenin bir yolu olsa da, bu çözüm düzgün değildir.
warunapww

1

push, dizilerin bir yöntemidir, bu nedenle nesne için son öğenin dizinini alabilirsiniz ve muhtemelen aşağıdaki gibi nesne için push ile aynı işi yapabilirsiniz

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

sonra öğenin yeni dizinine nesne ekleyin

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

1

JS'de döngü yapmak için tasarlamıyorsanız, sizin için döngü yapmak için PHP'ye geçin

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

bu kavram biraz yardımcı olabilir


1

Bu eski bir sorudur, neyse bugün en iyi uygulama Object.defineProperty kullanmaktır .

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.