オブジェクトに追加する


156

アラートとそれらに関するいくつかの情報を保持するオブジェクトがあります。

var alerts = { 
    1: { app: 'helloworld', message: 'message' },
    2: { app: 'helloagain', message: 'another message' }
}

これに加えて、アラートの数を示す変数がありalertNoます。私の質問は、新しいアラートを追加するときに、alertsオブジェクトにアラートを追加する方法はありますか?


6
投稿したjsonに問題があると思います:1:{app: 'helloworld'、 'message'} => 1:{app: 'helloworld'、message: 'a message'}?
Andreas Grech

回答:


235

アラートを単一のオブジェクトのプロパティではなく配列のレコードとして保存してみませんか?

var alerts = [ 
    {num : 1, app:'helloworld',message:'message'},
    {num : 2, app:'helloagain',message:'another message'} 
]

そしてそれを追加するには、次のように使用しますpush

alerts.push({num : 3, app:'helloagain_again',message:'yet another message'});

1
この回答は、追加するアラートのIDを知っていることを期待しています。まあ、あなたがすでにそれを知っているなら、あなたは単純に元のオブジェクトフォーマットに従って次のことをすることができます:alerts[3] = { app: 'hello3', message: 'message 3' }。これにより、IDでメッセージにアクセスできますalerts[2] => { app: 'helloworld', message: 'message' }。その場合、長さを取得するのは次のとおりですObject.keys(alerts).length(その方が配列の方簡単です)
Matt

61

jQuery $.extend(obj1, obj2)は2つのオブジェクトをマージしますが、実際には配列を使用する必要があります。

var alertsObj = {
    1: {app:'helloworld','message'},
    2: {app:'helloagain',message:'another message'}
};

var alertArr = [
    {app:'helloworld','message'},
    {app:'helloagain',message:'another message'}
];

var newAlert = {app:'new',message:'message'};

$.extend(alertsObj, newAlert);
alertArr.push(newAlert);

JQueryの拡張が遅い:trevmex.com/post/2531629773/jquerys-extend-is-slow。また、タイプミスもあります。$ .extends()は$ .extend()を読み取る必要があります。
ケン

タイプミスをうまくキャッチします。$ .extendsが役立つ状況もありますが、可能であればそれを避けるべきです。
RespectTheCode

1
ブラケットなしの1つのレコード構造しかない場合、extend()は問題ないと思います。残りの部分は、respectTheCodeに同意します。push()を使用してください
elvenbyte

39

Object.assign()でこれを行うことができます。場合によっては配列が必要ですが、OData呼び出しなど、単一のJSONオブジェクトを期待する関数を使用する場合、このメソッドは配列を作成してそれをアンパックするよりも簡単であることがわかりました。

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}

alerts = Object.assign({3: {app:'helloagain_again',message:'yet another message'}}, alerts)

//Result:
console.log(alerts)
{ 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
    3: {app: "helloagain_again",message: "yet another message"}
} 

編集:次のキーの取得に関するコメントに対処するには、Object.keys()関数を使用してキーの配列を取得できます。キーをインクリメントする例については、Vadiの回答を参照してください。同様に、Object.values()ですべての値を取得し、Object.entries()でキーと値のペアを取得できます。

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}
console.log(Object.keys(alerts))
// Output
Array [ "1", "2" ]

7
他の人がオブジェクトを配列に変換することを参照しているので、これは実際には正しい答えですが、この方法でオブジェクトとして保持します。著者の場合、配列を操作する方がよい可能性がありますが、これがオブジェクトに追加する方法の答えになります。
Goran Jakovljevic

2
ええ、私は同意します。問題のオブジェクトの配列は単なるオブジェクトではないので、これは完全な答えです!
Kishan Oza

これは正しい答えです。新しいオブジェクトを追加するインデックスをどのようにして知ることができますか?
Capan

1
これがタイトルの質問に対する答えです。
FistOfFury

11

他の回答で指摘されているように、配列を操作する方が簡単な場合があります。

そうでない場合:

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}

// Get the current size of the object
size = Object.keys(alerts).length

//add a new alert 
alerts[size + 1] = {app:'Your new app', message:'your new message'}

//Result:
console.log(alerts)
{ 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
    3: {app: "Another hello",message: "Another message"}
}      

それを試してみてください:

https://jsbin.com/yogimo/edit?js,console


アラートを削除したり、キーをスキップしたりすると、これは機能しません。while(alerts[size]) size++;And の行に沿って何かを追加し、おそらくに名前sizeを変更する必要がありnewIdます。
ティル

11

スプレッド構文は次のように使用できます。

var alerts = { 
1: { app: 'helloworld', message: 'message' },
2: { app: 'helloagain', message: 'another message' }
 }

alerts = {...alerts, 3: {app: 'hey there', message: 'another message'} }

7

ES6では、この作業を非常に簡単にすることができる非常に強力なスプレッドオペレーター(...オブジェクト)が用意されています。次のように実行できます。

let alerts = { 
   1: { app: 'helloworld', message: 'message' },
   2: { app: 'helloagain', message: 'another message' }
} 

//now suppose you want to add another key called alertNo. with value 2 in the alerts object. 

alerts = {
   ...alerts,
   alertNo: 2
 }

それでおしまい。必要なキーが追加されます。お役に立てれば!!


6

アラートの提案の配列を実際に使用する必要がありますが、それ以外の場合、言及したオブジェクトに追加すると次のようになります。

alerts[3]={"app":"goodbyeworld","message":"cya"};

しかし、名前がすべてを引用してリテラル番号を使用してはいけないので、

alerts['3']={"app":"goodbyeworld","message":"cya"};

または、オブジェクトの配列にすることもできます。

アクセス方法は

alerts['1'].app
=> "helloworld"

5

最も外側の構造を配列に変更する機能はありますか?だからこのようになります

var alerts = [{"app":"helloworld","message":null},{"app":"helloagain","message":"another message"}];

1つ追加する必要がある場合は、アレイにプッシュするだけです。

alerts.push( {"app":"goodbyeworld","message":"cya"} );

次に、エラーが列挙される方法について、組み込みのゼロベースのインデックスがあります。


2

ES6ではるかに簡単:

let exampleObj = {
  arg1: {
    subArg1: 1,
    subArg2: 2,
  },
  arg2: {
    subArg1: 1,
    subArg2: 2,
  }
};

exampleObj.arg3 = {
  subArg1: 1,
  subArg2: 2,
};

console.log(exampleObj);

{
arg1: {subArg1: 1, subArg2: 2}
arg2: {subArg1: 1, subArg2: 2}
arg3: {subArg1: 1, subArg2: 2}
}

0

別の方法として、ES6では、spread構文を使用できます。アラートのために${Object.keys(alerts).length + 1}idに戻ります。

let alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
};

alerts = {
  ...alerts, 
  [`${Object.keys(alerts).length + 1}`]: 
  { 
    app: `helloagain${Object.keys(alerts).length + 1}`,message: 'next message' 
  } 
};

console.log(alerts);


0

すみませんが、私は私の評判により、すでにあなたの答えをコメントすることはできません!...そう、あなたがオブジェクトの構造を変更したい場合は、あなたがしなければなりませんは、Thane Plummerが言うようにが、場所を気にしない場合は少しトリックですアイテムを配置するには:挿入の数を指定しない場合、最初の位置に挿入されます。

たとえば、JsonオブジェクトをmongoDB関数呼び出しに渡し、受け取った条件内に​​新しいキーを挿入する場合、これはすばらしいことです。この場合、コード内の変数の情報を含むアイテムmyUidを挿入します。

// From backend or anywhere
let myUid = { _id: 'userid128344'};
// ..
// ..

  let myrequest = { _id: '5d8c94a9f629620ea54ccaea'};
  const answer = findWithUid( myrequest).exec();

// ..
// ..

function findWithUid( conditions) {
  const cond_uid = Object.assign({uid: myUid}, conditions);
  // the object cond_uid now is:
  // {uid: 'userid128344', _id: '5d8c94a9f629620ea54ccaea'}
  // so you can pass the new object Json completly with the new key
  return myModel.find(cond_uid).exec();
}


0

[Javascript]少しジッキーなポケリーの後、これは私にとってはうまくいきました:

 let dateEvents = (
            {
                'Count': 2,
                'Items': [
                    {
                        'LastPostedDateTime': {
                            "S": "10/16/2019 11:04:59"
                        }
                    },
                    {
                        'LastPostedDateTime': {
                            "S": "10/30/2019 21:41:39"
                        }
                    }
                ],
            }
        );
        console.log('dateEvents', dateEvents);

私が解決する必要があった問題は、任意の数のイベントが発生する可能性があり、それらはすべて同じ名前になるということでした:LastPostedDateTime異なるのは日付と時刻だけです。


-1

これを試して:

alerts.splice(0,0,{"app":"goodbyeworld","message":"cya"});

かなりうまくいき、配列の先頭に追加します。


オブジェクトではspliceを呼び出せないため、これは機能しませんでした。配列のみです。
Richard Woolf
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.