การเพิ่มองค์ประกอบให้กับวัตถุ


222

ฉันต้องการที่จะเติมไฟล์ json ตอนนี้ฉันมีสิ่งนี้:

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

และฉันต้องการเพิ่ม "องค์ประกอบ" อีกอัน ขั้นตอนแรกของฉันคือการวาง json นั้นในประเภทวัตถุโดยใช้cart = JSON.parseตอนนี้ฉันต้องเพิ่มองค์ประกอบใหม่ ฉันคิดว่าฉันต้องใช้cart.pushเพื่อเพิ่มองค์ประกอบอื่นฉันลองนี้:

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

แต่ฉันได้รับข้อผิดพลาด "Object ไม่มีวิธีผลัก" เมื่อฉันพยายามทำelement.pushและฉันคิดว่าฉันกำลังทำอะไรผิดไปมากเพราะฉันไม่ได้บอก "องค์ประกอบ" ทุกที่

ฉันจะทำสิ่งนั้นได้อย่างไร

แก้ไข:ขอโทษทุกคนฉันมีความสับสนมากในหัวของฉัน

ฉันคิดว่าฉันจะได้รับเฉพาะออบเจ็กต์ประเภทเมื่อรับข้อมูลJSON.parseแต่ฉันได้สิ่งที่ฉันใส่ใน JSON ตั้งแต่แรก

การวางอาร์เรย์แทนวัตถุแก้ปัญหาของฉันฉันใช้คำแนะนำมากมายมาที่นี่ด้วยขอบคุณทุกคน!



Object.assign (เป้าหมายแหล่งที่มา); สามารถใช้เพื่อคัดลอกคุณสมบัติทั้งหมดจากวัตถุต้นฉบับไปยังวัตถุเป้าหมาย
David Spector

คำตอบ:


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
ขอบคุณ แต่รถเข็นของฉันตอนนี้ไม่ใช่อาร์เรย์และฉันไม่สามารถทำตะกร้าได้ :( ฉันต้องการวัตถุที่จะใช้ JSON.stringify (รถเข็น) หลังจากการดำเนินการนี้
HypeZ

@HypeZ คุณยังสามารถแยกแยะรถเข็นได้หากเป็นอาร์เรย์ของวัตถุ
Konstantin Dinev

ขอขอบคุณอีกครั้ง! แต่ข้อมูลพื้นฐานของฉันคือสาเหตุชนิดวัตถุของ "รถเข็น = JSON.parse (jsonfile)" ในตอนแรก .. ฉันไม่คิดว่าฉันควรใช้ json เป็นวัตถุแปลงเป็นอาร์เรย์เพิ่มองค์ประกอบ stringify ..
HypeZ

ด้วยเหตุผลบางอย่างวัตถุของฉันจะเต็มไปด้วยองค์ประกอบสุดท้ายเท่านั้น เช่นฉันมี 4 รายการที่แตกต่างกัน แต่ในวัตถุทั้งหมด 4 องค์ประกอบคือ = วิธีแก้ปัญหาค่าสุดท้ายที่ฉันพบคือการสร้างองค์ประกอบ = {}; ข้างในของจากนั้นทำงานอย่างถูกต้อง
Gorodeckij Dimitrij

1
@GorodeckijDimitrij หากคุณนำวัตถุองค์ประกอบเดิมมาใช้ใหม่และคุณใส่กุญแจใหม่ด้วยค่าใหม่คุณจะต้องแก้ไของค์ประกอบหนึ่งและอินสแตนซ์เดียวกันขององค์ประกอบผลักมันอีกครั้งและอีกครั้งในอาร์เรย์ เพียงใช้วัตถุองค์ประกอบใหม่สำหรับแต่ละองค์ประกอบที่คุณเพิ่มซึ่งเป็นสิ่งที่คุณทำในขอบเขตของ for-loop
Konstantin Dinev

162

ด้วยแถวนั้น

var element = {};

คุณกำหนดelementให้เป็นวัตถุธรรมดา วัตถุ JavaScript ดั้งเดิมไม่มีpush()วิธีการ ในการเพิ่มรายการใหม่ไปยังวัตถุธรรมดาให้ใช้ไวยากรณ์นี้:

element[ yourKey ] = yourValue;

ในอีกทางหนึ่งคุณสามารถกำหนดelementเป็นอาร์เรย์โดยใช้

var element = [];

push()จากนั้นคุณสามารถเพิ่มองค์ประกอบโดยใช้


4
element[ yourKey ] = yourValue;เป็นวิธีที่ดีที่สุดในการเพิ่มองค์ประกอบให้กับวัตถุ
Pramesh Bajracharya

แต่คุณไม่สามารถให้ลำดับขององค์ประกอบที่เพิ่มในวัตถุด้วยองค์ประกอบ [yourKey] = yourValue;
RollerCosta

2
@Pramesh Bajracharya มันไม่ได้เพิ่มค่าให้กับองค์ประกอบเพียงแค่ตั้งองค์ประกอบปัจจุบันเป็นค่าที่
Hasen

1
@sommesh คุณต้องการเก็บสำเนาอย่างไร คุณสามารถทำได้element[ yourkey ] = [ element{yourkey], yourNewValue ];
Sirko

1
@sommesh สิ่งนี้จะให้คีย์ที่ซ้ำกันซึ่งตามนิยามไม่สามารถทำได้ในวัตถุ JS คุณสามารถรวบรวมได้หลายค่าสำหรับหนึ่งคีย์เช่นเดียวกับที่ฉันเคยแสดงมาก่อน
Sirko

21

หากต้องมีการจัดเก็บรถเข็นเป็นวัตถุและไม่ใช่อาร์เรย์ (แม้ว่าฉันจะแนะนำให้เก็บเป็น []) คุณสามารถเปลี่ยนโครงสร้างเพื่อใช้ ID เป็นคีย์ได้เสมอ:

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 ไม่ส่งผลให้ใครคำตอบของ Craig ไม่ได้เพิ่มอาเรย์จะใช้วงเล็บ [] เพื่อเข้าถึงคุณสมบัติ ทดสอบที่นี่บน 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}}


นี่อาจเป็นวิธีที่ใช้งานได้ดีที่สุดในการทำสิ่งต่าง ๆ แต่นักพัฒนาจาวาสคริปต์รุ่นใหม่อาจจะไม่เข้าใจในเรื่องนี้
codeninja

1
ฉันลองมัน แต่มันจะแทนที่องค์ประกอบที่มีอยู่เพราะทั้งคู่มีชื่อเหมือนกันelementดังนั้นมันจะมีองค์ประกอบสุดท้ายเท่านั้น
Haritsinh Gohil

7

ฉันกำลังอ่านสิ่งที่เกี่ยวข้องกับการลองนี้หากมีประโยชน์

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()ฟังก์ชัน


6

คุณควรเขียนvar element = [];
ด้วยจาวาสคริปต์{}เป็นวัตถุว่างและ[]เป็นอาร์เรย์ว่าง


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

4
ไม่สามารถซื้อรถเข็นได้เนื่องจากรถเข็นเป็นวัตถุตอนนี้! :(
HypeZ

เหตุผลเฉพาะใด ๆ ที่ว่าทำไมมันถึงเป็นวัตถุแทนที่จะเป็นอาเรย์?
Cris

เพราะฉันได้รับจาก "รถเข็น = JSON.parse (jsonfile)" และมันให้วัตถุ
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;
}

รหัสนี้ใช้งานได้


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

obj ค่าใหม่:

{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นั้นเป็นแผนที่ค่าคีย์ โหวตขึ้นถ้าคำตอบนั้นมีประโยชน์ ขอบคุณ!
Saad Patel

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" และให้ id ขององค์ประกอบที่เราต้องการจากอาร์เรย์ของเรา ส่งคืนวัตถุ "elemnt" แน่นอนว่าเราไม่จำเป็นต้องใช้ ID ในการค้นหาวัตถุ เราสามารถใช้คุณสมบัติอื่นใดเพื่อทำการค้นหา


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

พุชเป็นวิธีการของอาร์เรย์ดังนั้นสำหรับวัตถุที่คุณสามารถรับดัชนีขององค์ประกอบสุดท้ายและคุณสามารถทำเช่นเดียวกับการผลักดันวัตถุดังต่อไปนี้

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.