JavaScriptオブジェクトのpush()関数


101

私はjavascriptオブジェクトを持っています(私は実際にはajaxリクエストを通じてデータを取得しています):

var data = {};

私はそれにいくつかのものを追加しました:

data[0] = { "ID": "1"; "Status": "Valid" }
data[1] = { "ID": "2"; "Status": "Invalid" }

次に、無効なステータスのすべてのオブジェクトを削除します(ただし、すべての順序を同じに保ちます)。

var tempData = {};
for ( var index in data ) {
    if ( data[index].Status == "Valid" ) {
        tempData.push( data );
    }
}
data = tempData;

私の考えでは、これらはすべてtempData.push機能するはずですが、関数ではないエラーが発生します。なぜそれが配列と同じではないのか理解していますが、それ以外の場合はどうすればよいですか?


4
配列を使用する必要があるようです
Esailija '19年

回答:


131

push()オブジェクトではなく配列用なので、正しいデータ構造を使用してください。

var data = [];
// ...
data[0] = { "ID": "1", "Status": "Valid" };
data[1] = { "ID": "2", "Status": "Invalid" };
// ...
var tempData = [];
for ( var index=0; index<data.length; index++ ) {
    if ( data[index].Status == "Valid" ) {
        tempData.push( data );
    }
}
data = tempData;

9
+1で負けました。for...inループも変更することを忘れないでください。
アンディE

@MattBall私の悪い!私は実際にSOのレビューとかで得意ではありません!:)
Shouvik

1
プッシュは配列用ですが、オブジェクトに配列を追加する方法はありますか?
Venkat 2015年

1
連想配列はどうですか?
Kinnard Hockenhull 2016年

@KinnardHockenhullすみません、質問が理解できません。あなたが求めていることを明確にできますか?
Matt Ball

17

オブジェクトはプッシュプロパティをサポートしていませんが、インデックスをキーとして使用して保存することもできます。

var tempData = {};
for ( var index in data ) {
  if ( data[index].Status == "Valid" ) { 
    tempData[index] = data; 
  } 
 }
data = tempData;

これを行うことで、オブジェクトのステータスが無効な場合にオブジェクトを削除する方が簡単だと思います。

for(var index in data){
  if(data[index].Status == "Invalid"){ 
    delete data[index]; 
  } 
}

そして最後に、var tempを作成する必要はありません–


現在の問題を修正する方法で、この答えのヘルプOPのための答えを持ついくつかの説明を追加
ρяσѕρєяK

5

あなたが作る必要があります var tempData = new Array();

プッシュは配列関数です。


9
なぜnew Array()ありませんか[]
マットボール

3
[]は、新しい配列を作成するための代替(ショートカット)です。[]とnew Array()で作成できます。
Alex Dn 2012年

6
[]配列を作成する主な方法は、他の方法であり、上書きすることもできます。
エサイリヤ2012年

6
なぜ悪であるかの説明については、stackoverflow.comnew Array()
/ questions / 885156 /…を

w3schools.com/js/js_obj_array.asp 新しい配列は通常の配列です。[]はプライマリとして定義されていますか?
Alex Dn 2012年

3

JavaScriptプログラミング言語は関数型プログラミングパラダイムをサポートしているため、これらのコードを簡単に使用できます。

var data = [
    {"Id": "1", "Status": "Valid"},
    {"Id": "2", "Status": "Invalid"}
];
var isValid = function(data){
    return data.Status === "Valid";
};
var valids = data.filter(isValid);

2

私は本当にあなたがサーバーからオブジェクトを取得し、出力でオブジェクトを取得したいと思います

Object.keys(data).map(k=> data[k].Status=='Invalid' && delete data[k])


0
    tempData.push( data[index] );

上記の正解に同意しますが、tempDataに追加するデータのインデックス値がまだ与えられていません。[index]値がない場合、配列全体が追加されます。


問題の解決方法を詳しく教えてください。ありがとう。
Leonid Glanz、2015年

これは、Matt Ballからの承認済みの回答を修正するためのものです。データをループしているので、データ全体ではなく、data [index]のみをプッシュする必要があります。
ジョナサンベルジェロン

-2

行う :


var data = new Array();
var tempData = new Array();


4
なぜnew Array()ありませんか[]
マットボール

new Array();の違いに注意してください。そして新しい配列; あなたは、代替案について伝えるのではなく、このような質問に答えることができるはず...
ジョナサン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.