オブジェクトを配列に追加する方法


317

オブジェクトを配列(JavaScriptまたはjquery)に追加するにどうすればよいですか?たとえば、このコードの問題は何ですか?

function(){
    var a = new array();
    var b = new object();
    a[0]=b;
}

このコードを使用して、function1の配列に多くのオブジェクトを保存し、配列内のオブジェクトを使用するためにfunction2を呼び出します。

  1. オブジェクトを配列に保存するにはどうすればよいですか?
  2. オブジェクトを配列に入れて変数に保存するにはどうすればよいですか?

12
edit 5が行ったように、投稿されたコードのエラーを修正しないでください。質問の単純なエラーを修正する場合、多くの場合、答えが存在する理由はありません。
ポール

また、pushすでにここで複数回提案されています。このスレッドを別のpush提案で汚染しないでください。
Boghyon Hoffmann

回答:


631

Array.push()を使用して、配列に何でも入れます。

var a=[], b={};
a.push(b);    
// a[0] === b;

配列に関する追加情報

一度に複数のアイテムを追加する

var x = ['a'];
x.push('b', 'c');
// x = ['a', 'b', 'c']

配列の先頭にアイテムを追加する

var x = ['c', 'd'];
x.unshift('a', 'b');
// x = ['a', 'b', 'c', 'd']

ある配列の内容を別の配列に追加する

var x = ['a', 'b', 'c'];
var y = ['d', 'e', 'f'];
x.push.apply(x, y);
// x = ['a', 'b', 'c', 'd', 'e', 'f']
// y = ['d', 'e', 'f']  (remains unchanged)

2つの配列の内容から新しい配列を作成する

var x = ['a', 'b', 'c'];
var y = ['d', 'e', 'f'];
var z = x.concat(y);
// x = ['a', 'b', 'c']  (remains unchanged)
// y = ['d', 'e', 'f']  (remains unchanged)
// z = ['a', 'b', 'c', 'd', 'e', 'f']

私も質問があります:myArray = []; myArray.push({'text': 'some text'、 'id':13}); そして今myArrayは空です。したがって、myArray [0] ['text']から値を取得しようとすると、空になります。なぜですか?take.ms/jSvbn
fdrv

何かがおかしいようです。スコーピングの問題がないことを確認してください。let / varを使用してmyArrayを宣言します。myArray.pushは常にmyArrayを変更するためです。
John Strickler、2016年

58
var years = [];
for (i= 2015;i<=2030;i=i+1)
{
years.push({operator : i})
}

ここで配列年は次のような値を持っています

years[0]={operator:2015}
years[1]={operator:2016}

このように続きます。


55

まず、objectまたははありませんarray。あるObjectArray。次に、それ行うことができます:

a = new Array();
b = new Object();
a[0] = b;

これab唯一の要素としての配列になります。


4
+1は、あまり複雑でない回答です。私はOPの質問2への回答含めるように下にそれを拡大してきました
サム・

30

ES6表記を使用すると、次のようなことができます。

追加する場合は、次のようなスプレッド演算子を使用できます。

var arr1 = [1,2,3]
var obj = 4
var newData = [...arr1, obj] // [1,2,3,4]
console.log(newData);


20
  • JavaScriptでは大文字と小文字が区別されます。呼び出すnew array()new object()スローされますReferenceErrorが存在しないからです。
  • エラーが発生しやすいため、回避するnew Array()ことをお勧めします
    代わりに、で新しい配列を割り当て = [val1, val2, val_n]ます。オブジェクトの場合は、を使用します= {}
  • 配列の拡張に関しては多くの方法がありますが(ジョンの回答に示されているように)、最も安全な方法はのconcat代わりに使用することですpushconcat元の配列をそのままにして、新しい配列を返します。特に配列がグローバルに定義されている場合は、避けるべきpush呼び出し配列を変更します。
  • 意図しない変更を回避するために、オブジェクトと新しい配列をフリーズすることもお勧めします。フリーズされたオブジェクトは、変更可能でも拡張可能でもありません(浅く)。

これらのポイントを適用して2つの質問に答えるには、次のような関数を定義します。

function appendObjTo(thatArray, newObj) {
  const frozenObj = Object.freeze(newObj);
  return Object.freeze(thatArray.concat(frozenObj));
}

使用法:

// Given
const myArray = ["A", "B"];
// "save it to a variable"
const newArray = appendObjTo(myArray, {hello: "world!"});
// returns: ["A", "B", {hello: "world!"}]. myArray did not change.

2
「使用法」は、これを私の個人的な好みの答えにしたものです。
HPWD

@boghyon、私はフリーズとミューテーションに興味があります。concatメソッドが原因で直接発生する可能性がある配列への変更、または「.concat()」の実行中にスクリプトの他の場所から配列に加えられる可能性がある変更について話していますか?2番目の場合、非同期コードの場合でも、JavaScriptがシングルスレッドであるため、少なくとも理論的にはメソッドが完了するまで制御が返されないため、これは自動的に防止されませんか?
jdmayfield

@jdmayfield:JSの評価戦略は、オブジェクト共有によって呼び出されます。オブジェクトが渡されるとき、それらはコピーされません。これらのオブジェクトの変更は、渡されている間、ミューテーターが非同期に呼び出されたか、完了しているかに関係なく、常に呼び出し元にすぐに表示されます。このような副作用はしばしばバグを引き起こすため、元のオブジェクトから切り離された新しいオブジェクトを返します。オブジェクトを(たとえばを介してfreeze)不変にすることは、意図しない変更を防ぐための追加の手順にすぎません。
ボギヨンホフマン2018

@jdmayfield:しかし、すでにご想像のとおり、オブジェクトが巨大になると、毎回新しいオブジェクトを作成するとすぐに非効率になる可能性があります。そのような場合のために、Mori(kind dead)やImmutable.jsなどの永続的なデータ構造を活用することで効率的なライブラリが用意されています。:ここでは「なぜ不変性」について簡単に紹介されyoutu.be/e-5obm1G_FY
Boghyonホフマン

9

ガビ・プルカルの答えを拡張して、2番の答えを含める。

a = new Array();
b = new Object();
a[0] = b;

var c = a[0]; // c is now the object we inserted into a...

8

/* array literal */
var aData = [];

/* object constructur */
function Data(firstname, lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
  this.fullname = function() {
    return (this.firstname + " " + this.lastname);
  };
}

/* store object into array */
aData[aData.length] = new Data("Java", "Script"); // aData[0]

aData.push(new Data("Jhon", "Doe"));
aData.push(new Data("Anna", "Smith"));
aData.push(new Data("Black", "Pearl"));

aData[aData.length] = new Data("stack", "overflow"); // aData[4]

/* loop arrray */
for (var x in aData) {
  alert(aData[x].fullname());
}

/* convert array of object into string json */
var jsonString = JSON.stringify(aData);
document.write(jsonString);


7

obejct明らかにタイプミスです。しかし、両方objectarray必要性の大文字。

あなたはのための短い手を使用することができますnew Arrayし、new Objectこれらがある[]{}

を使用して配列にデータをプッシュでき.pushます。これにより、配列の最後に追加されます。または、データを含むインデックスを設定できます。

function saveToArray() {
    var o = {};
    o.foo = 42;
    var arr = [];
    arr.push(o);
    return arr;
}

function other() {
    var arr = saveToArray();
    alert(arr[0]);
}

other();

5

代替の答えはこれです。

次のような配列がある場合: var contacts = [bob, mary];

この配列に別の配列を置きたい場合は、次のようにできます。

関数コンストラクターを宣言する

function add (firstName,lastName,email,phoneNumber) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.phoneNumber = phoneNumber;
}

関数からオブジェクトを作成します。

var add1 = new add("Alba","Fas","Des@gmail.com","[098] 654365364");

オブジェクトを配列に追加します。

contacts[contacts.length] = add1;

3
a=[];
a.push(['b','c','d','e','f']);

6
こんにちは、SOへようこそ。答えとして単にコードをダンプしないでください。ユーザーが何が起こっているのかをよりよく理解できるように、考えを説明してください。ありがとう。
クトゥルフ

2

自動リストを使用してオブジェクト作成者を作成する方法:

var list = [];

function saveToArray(x) {
    list.push(x);
};

function newObject () {
    saveToArray(this);
};

0

このようなコードを使用すると、スコープの問題が発生します。関数間で使用する場合(または呼び出す場合は、パラメーターとして渡す場合)は、関数の外側で宣言する必要があります。

var a = new Array();
var b = new Object();

function first() {
a.push(b);
// Alternatively, a[a.length] = b
// both methods work fine
}

function second() {
var c = a[0];
}

// code
first();
// more code
second();
// even more code
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.