web-dev-qa-db-ja.com

オブジェクトの配列を宣言する

配列である変数があり、配列のすべての要素がデフォルトでオブジェクトとして機能するようにします。これを達成するために、私は私のコードでこのようなことをすることができます。

var sample = new Array();
sample[0] = new Object();
sample[1] = new Object();

これはうまく機能しますが、インデックス番号については触れたくありません。配列のすべての要素をオブジェクトにしたいです。宣言または初期化するにはどうすればいいですか。

var sample = new Array();
sample[] = new Object();

上記のコードを試しましたが、うまくいきません。インデックス番号を使わずにオブジェクトの配列を初期化するにはどうすればいいですか?

72
Prasath K

配列の末尾に項目を追加するには、array.Push()を使用します。

var sample = new Array();
sample.Push(new Object());

これをn回行うには、forループを使用します。

var n = 100;
var sample = new Array();
for (var i = 0; i < n; i++)
    sample.Push(new Object());

new Array()[]で、new Object(){}で置き換えることもできます。

var n = 100;
var sample = [];
for (var i = 0; i < n; i++)
    sample.Push({});
79
Daniel Imms

宣言の意味によっては、 配列リテラル の中で オブジェクトリテラル を使ってみることができます。

var sample = [{}, {}, {} /*, ... */];

EDIT:あなたの目標がデフォルトで空のオブジェクトリテラルであるundefined項目である配列であれば、小さな効用関数を書くことができます。

function getDefaultObjectAt(array, index)
{
    return array[index] = array[index] || {};
}

それからこのようにそれを使ってください:

var sample = [];
var obj = getDefaultObjectAt(sample, 0);     // {} returned and stored at index 0.

あるいは:

getDefaultObjectAt(sample, 1).prop = "val";  // { prop: "val" } stored at index 1.

もちろん、getDefaultObjectAt()の戻り値への直接代入はうまくいきませんので、書くことはできません。

getDefaultObjectAt(sample, 2) = { prop: "val" };
31

あなたがコメントでどのように反応したかを見た後。他の人が示唆しているようにPushを使うのが最善のようです。こうすれば、インデックスを知る必要はありませんが、それでも配列に追加できます。

var arr = [];
function funcInJsFile() {
    // Do Stuff
    var obj = {x: 54, y: 10};
    arr.Push(obj);
}

この場合、その関数を使用するたびに、新しいオブジェクトを配列にプッシュします。

11
Jeff Shaver

空のObjectsを作成する必要はまったくありません。あなたは彼らと何もすることができません。必要に応じて作業オブジェクトをサンプルに追加するだけです。 Daniel Immsが示唆しているようにPushを使用し、FrédéricHamidiが示唆しているようにリテラルを使用してください。あなたはCのようなJavascriptをプログラムしたいようです。

var samples = []; /* If you have no data to put in yet. */
/* Later, probably in a callback method with computed data */
/* replacing the constants. */
samples.Push(new Sample(1, 2, 3)); /* Assuming Sample is an object. */
/* or */
samples.Push({id: 23, chemical: "NO2", ppm: 1.4}); /* Object literal. */

new Array(10)を使用すると、10個のundefined要素を持つ配列が作成されると思います。

10
Eric Jablow

このように「オブジェクト型」の配列を1行でインスタンス化することができます(new Object()を自分のオブジェクトに置き換えてください)。

var elements = 1000;
var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });
7
MarzSocks

fill() 、次に map を使うことができます。一目瞭然です。

let arr = new Array(5).fill(null).map(v => new String('lol'));

5文字列オブジェクトの配列を作成します(文字列ではありません!)。それから、例えばforEachを使うことができます。

arr.forEach(d => console.log(d.toString()));

この質問に対する答えは私の意見では不必要に冗長です。だから私はこれがあなた方の何人かに役立つことを願っています。

5
Ced

さて、array.lengthがうまくいくかどうか?のようなもの、私はあなたがちょうどそれを読んでいればあなたはインデックスの範囲を知る必要がないことを意味します..

var arrayContainingObjects = [];
for (var i = 0; i < arrayContainingYourItems.length; i++){
    arrayContainingObjects.Push {(property: arrayContainingYourItems[i])};
}

多分私はあなたの質問を正しく理解していなかったかもしれませんが、あなたはこのようにあなたの配列の長さを得てそれらをオブジェクトに変換することができるはずです。ダニエルは、正直言って同じ答えを出しました。あなたは単にあなたの配列の長さを彼の変数に保存することができ、それは行われるでしょう。

私の考えではIFとこれは起こらないはずですあなたはあなたの配列の長さを取得することはできません。あなたがインデックス番号を取得せずに言ったように、あなたはこのようにそれをすることができました:

var arrayContainingObjects = [];
for (;;){
    try{
        arrayContainingObjects.Push {(property: arrayContainingYourItems[i])};
    }
}
catch(err){
    break;
}

それは上記のものの悪くないバージョンですが、ループはインデックスの範囲外で "実行"されるまで実行されます。

5
spitterfly

これを試して-

var arr = [];
arr.Push({});
3
ShuklaSannidhya
//making array of book object
var books = [];
    var new_book = {id: "book1", name: "twilight", category: "Movies", price: 10};
    books.Push(new_book);
    new_book = {id: "book2", name: "The_call", category: "Movies", price: 17};
    books.Push(new_book);
    console.log(books[0].id);
    console.log(books[0].name);
    console.log(books[0].category);
    console.log(books[0].price);

// also we have array of albums
var albums = []    
    var new_album = {id: "album1", name: "Ahla w Ahla", category: "Music", price: 15};
    albums.Push(new_album);
    new_album = {id: "album2", name: "El-leila", category: "Music", price: 29};
    albums.Push(new_album);
//Now, content [0] contains all books & content[1] contains all albums
var content = [];
content.Push(books);
content.Push(albums);
var my_books = content[0];
var my_albums = content[1];
console.log(my_books[0].name);
console.log(my_books[1].name); 

console.log(my_albums[0].name);
console.log(my_albums[1].name); 

この例は私と一緒に動作します。 ブラウザコンソールの出力のスナップショット

3
Abdallah Okasha

ForEachを使用して、すでにデータを持っている場合に備えてデータを保存できます。データに対して何らかのビジネスログインを行いたいのです。

var sample = new Array();
var x = 10;
var sample = [1,2,3,4,5,6,7,8,9];
var data = [];

sample.forEach(function(item){
    data.Push(item);
})

document.write(data);

単純forループを使用した例

var data = [];
for(var i = 0 ; i < 10 ; i++){
   data.Push(i);
}
document.write(data);
0
Sachin Shah

配列の末尾に項目を追加するには、array.Push()を使用してください。

var sample = new Array();
sample.Push(new Object());

あなたはそれを使うことができます

var x = 100;
var sample = [];
for(let i=0; i<x ;i++){
  sample.Push({}) 
  OR
  sample.Push(new Object())
}    
0
ashishdudhat

配列内のすべての要素をオブジェクトにする場合は、JavaScript Proxyを使用して、配列に挿入する前にオブジェクトに検証を適用できます。とても簡単です。

const arr = new Proxy(new Array(), {
  set(target, key, value) {
    if ((value !== null && typeof value === 'object') || key === 'length') {
      return Reflect.set(...arguments);
    } else {
      throw new Error('Only objects are allowed');
    }
  }
});

今、あなたがこのようなことをやろうとするならば:

arr[0] = 'Hello World'; // Error

エラーが発生します。ただし、オブジェクトを挿入した場合は許可されます。

arr[0] = {}; // Allowed

プロキシの詳細については、このリンクを参照してください。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

あなたがpolyfillの実装を探しているなら、あなたはこのリンクをチェックアウトすることができます: https://github.com/GoogleChrome/proxy-polyfill

0
Sachin Singh