객체에 요소 추가


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 (대상, 소스); 소스 객체에서 대상 객체로 모든 속성을 복사하는 데 사용할 수 있습니다.
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
고맙지 만 내 장바구니는 지금 배열이 아니며 cart.push를 수행 할 수 없습니다 : (이 작업 후 JSON.stringify (cart)를 사용하려면 객체가 필요합니다
HypeZ

@HypeZ 카트가 객체의 배열 인 경우에도 카트를 문자열화할 수 있습니다.
Konstantin Dinev

다시 감사합니다! 그러나 내 기본 데이터는 처음에 "cart = JSON.parse (jsonfile)"의 객체 유형 원인입니다. json을 객체로 가져 와서 배열로 변환하고 요소를 추가하고 문자열 화해야한다고 생각하지 않습니다.
HypeZ

어떤 이유로 든 내 객체는 마지막 요소로 채워집니다. 예를 들어 4 개의 서로 다른 항목이 있지만 개체에 4 개의 요소가 모두 있습니다. 내부, 다음 제대로 작동
Gorodeckij Dimitrij

1
@GorodeckijDimitrij 동일한 요소 객체를 재사용하고 새로운 값으로 키를 다시 채우면 요소의 동일한 인스턴스를 수정하여 배열로 반복해서 밀어 넣습니다. 추가하는 각 요소에 대해 새 요소 객체를 사용하면됩니다. for 루프 범위에서 수행 한 작업입니다.
Konstantin Dinev

160

그 줄로

var element = {};

element일반 객체로 정의 합니다. 기본 JavaScript 객체에는 push()메소드 가 없습니다 . 일반 객체에 새 항목을 추가하려면 다음 구문을 사용하십시오.

element[ yourKey ] = yourValue;

반면에 다음을 element사용하여 배열로 정의 할 수 있습니다

var element = [];

그런 다음을 사용하여 요소를 추가 할 수 있습니다 push().


4
element[ yourKey ] = yourValue;객체에 요소를 추가 할 수있는 가장 좋은 방법입니다.
Pramesh Bajracharya

그러나 element [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 } }


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)

산출:

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


이것은 아마도 기능을 수행하는 가장 기능적인 방법이지만 새로운 자바 스크립트 개발자는 아마도 이것을 이해하지 못할 것입니다.
codeninja

1
나는 그것을 시도했지만 둘 다 같은 이름을 가지고 있기 때문에 기존 요소를 무시 element하므로 마지막 요소 만 갖습니다.
Haritsinh Gohil

6

당신은 var element = [];
자바 스크립트 {}로 작성해야 합니다 빈 개체이며 []빈 배열입니다.


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

4
cart는 객체이기 때문에 cart.push를 할 수 없습니다! :(
HypeZ

왜 배열이 아닌 객체인지 특별한 이유가 있습니까?
Cris

"cart = JSON.parse (jsonfile)"
가져 와서

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

obj 새로운 가치 :

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

2

cart배열로 사용하지 않고 비슷한 JSON을 만들려는 사람이 있다면 다음과 같이하십시오.

다음 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 구조에 값을 어떻게 추가합니까?
Jude Fernandes

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

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.