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


87

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

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

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

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

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


1
それで、デフォルトですべての配列アイテムをオブジェクトにしようとしていますか?
ジェフシェイバー2013

@Jeff Yuppは、あなたは正しいです...
Prasath K

そうする意味がわかりません。なぜこのようにしたいのかを理解することは、実際に問題を解決する方法を理解するのに役立つかもしれません。
ジェフシェイバー2013

1
オブジェクトには何が含まれていますか?array.push(objYouWant )関数内に実装することが間違いなく解決策のように思えます。そうすれば、関数が実行されるたびに、必要なプロパティを持つ新しいオブジェクトが追加されます。
ジェフシェイバー2013

1
それらを自動的にオブジェクトにすることがあなたの状況にどのように役立つかわかりません。
ジェフシェイバー2013

回答:


89

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({});

38

宣言する意味に応じて、配列リテラルオブジェクトリテラルを使用してみることができます。

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

編集:目標が、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" };

@PrasathK、配列を動的に(ループなどで)入力しているということですか?次に、ダニエルの答えに従い、を使用する必要がありますpush()
フレデリックハミディ2013

@PrasathK、その反対票は私のものではありません。私があなたを正しく理解しているなら、あなたの質問の下でのジェフ・シェーバーのコメントは正しいですか?
フレデリックハミディ2013

23

fill()を使用できます。

let arr = new Array(5).fill('lol');

let arr2 = new Array(5).fill({ test: 'a' });
// or if you want different objects
let arr3 = new Array(5).fill().map((_, i) => ({ id: i }));

5つのアイテムの配列を作成します。次に、たとえばforEachを使用できます。

arr.forEach(str => console.log(str));

これを行うときはnew Array(5)、長さが5のオブジェクトであり、配列が空であることに注意してください。あなたが使用fill()するとき、あなたはあなたが望むもので個々のスポットを埋めます。


あなたが投稿した直後に、たまたまフロントページにそれを見ました。とても古い質問で、新しい答えがあったので、それは私の目に留まりました。
メルポメネ2016

これは他の答えに比べて使いやすく理解しにくいと思います。
SachinShah18年

12

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

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

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


なんてこった..私はそれらのオブジェクトに100を超える変数があり、すべてのオブジェクトまたは関数の呼び出しに対して、関数の開始時にいくつかの変数のいくつかの値を初期化する必要があります
Prasath K 2013

11

空白を作成する必要はありませんObject。あなたはそれらで何もすることはできません。必要に応じて、作業オブジェクトをサンプルに追加するだけです。使用pushダニエルIMMSなどが提案され、フレデリック・ハミディとして使用するリテラルが示唆されました。あなたは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

次のように、「オブジェクトタイプ」の配列を1行でインスタンス化できます(new Object()オブジェクトに置き換えるだけです)。

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

2
要素の値がわからない場合はどうなりますか?
Prasath K 2015

6

うまくarray.lengthやるべきかどうか?のようなもの、私はあなたがそれを読んだだけならあなたがインデックス範囲を知る必要がないことを意味します。

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

質問を正しく理解していなかったかもしれませんが、この方法で配列の長さを取得し、それらをオブジェクトに変換できるはずです。ダニエルは正直に言うと同じ答えを出しました。配列の長さを彼の変数に保存するだけで完了します。

私の意見では、配列の長さを取得できない場合、これは発生しないはずです。インデックス番号を取得せずに言ったように、次のようにすることができます。

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

これは上記のものの良くないバージョンですが、インデックス範囲を「実行」するまでループが実行されます。


5

これを試して-

var arr = [];
arr.push({});

これにより、1つの要素のみがオブジェクトになります。すべての要素をオブジェクトにします
Prasath K 2013

1
@ShuklaSannidhyaこの投稿には、これが何をするのか、なぜそれを推奨するのかについての説明が不足しています。...ただ言って。
mickmackusa 2018

5
//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); 

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


1

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

1

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

1

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

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

ポリフィルの実装を探している場合は、次のリンクをチェックアウトできます:https//github.com/GoogleChrome/proxy-polyfill


1

私のプロジェクトからの以下のコードはおそらくあなたにとって良いでしょう

  reCalculateDetailSummary(updateMode: boolean) {

    var summaryList: any = [];
    var list: any;
    if (updateMode) { list = this.state.pageParams.data.chargeDefinitionList }
    else {
        list = this.state.chargeDefinitionList;
    }

    list.forEach((item: any) => {
        if (summaryList == null || summaryList.length == 0) {
            var obj = {
                chargeClassification: item.classfication,
                totalChargeAmount: item.chargeAmount
            };
            summaryList.push(obj);

        } else {
            if (summaryList.find((x: any) => x.chargeClassification == item.classfication)) {
                summaryList.find((x: any) => x.chargeClassification == item.classfication)
                    .totalChargeAmount += item.chargeAmount;
            }
        }
    });

    if (summaryList != null && summaryList.length != 0) {
        summaryList.push({
            chargeClassification: 'Total',
            totalChargeAmount: summaryList.reduce((a: any, b: any) => a + b).totalChargeAmount
        })
    }

    this.setState({ detailSummaryList: summaryList });
}

1
const sample = [];
    list.forEach(element => {
      const item = {} as { name: string, description: string };
      item.name= element.name;
      item.description= element.description;
      sample.push(item);
    });
    return sample;

誰もがこれを試して..そして何かを提案します。


-7
var ArrayofObjects = [{}]; //An empty array of objects.

1
いいえ。これは、1つのオブジェクトの空でない配列です。
クエンティン2016

Stack Overflowへようこそ!このコードスニペットは問題を解決する可能性がありますが、説明を含めると投稿の品質が向上します。あなたは将来読者のために質問に答えていることを忘れないでください、そしてそれらの人々はあなたのコード提案の理由を知らないかもしれません。また、説明コメントでコードを混雑させないようにしてください。これにより、コードと説明の両方が読みにくくなります。
kayess 2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.