オブジェクトを含む配列をループしてそのプロパティにアクセスする方法


188

配列に含まれるオブジェクトを循環させて、それぞれのプロパティを変更したいと思います。私がこれをすると:

for (var j = 0; j < myArray.length; j++){

console.log(myArray[j]);

}

コンソールは配列内のすべてのオブジェクトを表示するはずですよね?ただし、実際には最初のオブジェクトのみが表示されます。ループの外で配列をコンソールログに記録すると、すべてのオブジェクトが表示されるので、そこには確実に多くのオブジェクトがあります。

とにかく、これが次の問題です。ループを使用して、配列内のObject1.xなどにどのようにアクセスしますか?

for (var j = 0; j < myArray.length; j++){

console.log(myArray[j.x]);

}

これは「未定義」を返します。繰り返しになりますが、ループの外側のコンソールログから、オブジェクトにはすべて「x」の値があることがわかります。ループでこれらのプロパティにアクセスするにはどうすればよいですか?

プロパティごとに個別の配列を使用することを他の場所で推奨されましたが、最初にこの方法を使い果たしたことを確認したいと思います。

ありがとうございました!


2
アレイのサンプルを投稿できますか?最初のコードスニペットは正しいようです。
シルコ2013年

j数です。ループの先頭で定義しました。

2
たぶんmyArray、結局は本当に単なる配列ではないのでしょうか?
techfoobar 2013年

myArrayの構築方法に関する詳細情報が必要です
bgusach '18年

以下のすべての回答と受け入れられた回答があれば、問題が発生する理由とforループを使用してそれを解決する方法について誰も説明しません。#forEach動作します。しかし、問題はforループについてでした。
FreeLightman 2018

回答:


341

forEachを組み込みの配列関数として使用します。 Array.forEach()

yourArray.forEach(function (arrayItem) {
    var x = arrayItem.prop1 + 2;
    console.log(x);
});

2
助けてくれてうれしい..Javascriptはかなりクールになっています..それに加えて、forEachは非常に優れており、複雑なループを読みやすくなっています...
Dory Zidon

3
私はそれが怖いforEachIE 9ドゥではサポートされていない私を責めないで!私の雇用主の製品はそれをサポートします!
fatCop、2015年

1
@DoryZidon:forEachのサポートではないブレークまたは停止- developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
はAnkur Loriya

2
あなたが本当に配列を持っていることが重要であることに注意してください。そのyourArrayようなものから取得した場合document.getElementsByClassName、配列ではなくHTMLCollectionになります。次に、この質問は役に立ちます。
J0ANMM 2017年

注:forEachはブロッキングであり、サポートしていませんawaitfor...ofループはサポートします。
PotatoFarmer

107

JavaScriptの関数型プログラミングの方法で配列をループするいくつかの使用例:

1.配列をループするだけ

const myArray = [{x:100}, {x:200}, {x:300}];

myArray.forEach((element, index, array) => {
    console.log(element.x); // 100, 200, 300
    console.log(index); // 0, 1, 2
    console.log(array); // same myArray object 3 times
});

注:Array.prototype.forEach()は厳密には機能的な方法ではありません。入力パラメーターとして使用する関数は値を返すことを想定していないため、純粋な関数とは見なされません。

2.配列の要素のいずれかがテストに合格するかどうかを確認します

const people = [
    {name: 'John', age: 23}, 
    {name: 'Andrew', age: 3}, 
    {name: 'Peter', age: 8}, 
    {name: 'Hanna', age: 14}, 
    {name: 'Adam', age: 37}];

const anyAdult = people.some(person => person.age >= 18);
console.log(anyAdult); // true

3.新しい配列に変換する

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray= myArray.map(element => element.x);
console.log(newArray); // [100, 200, 300]

注:map()メソッドは、呼び出し元配列のすべての要素で提供された関数を呼び出した結果を含む新しい配列を作成します。

4.特定のプロパティを合計し、その平均を計算します

const myArray = [{x:100}, {x:200}, {x:300}];

const sum = myArray.map(element => element.x).reduce((a, b) => a + b, 0);
console.log(sum); // 600 = 0 + 100 + 200 + 300

const average = sum / myArray.length;
console.log(average); // 200

5.元の配列に基づいて、変更せずに新しい配列を作成します

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray= myArray.map(element => {
    return {
        ...element,
        x: element.x * 2
    };
});

console.log(myArray); // [100, 200, 300]
console.log(newArray); // [200, 400, 600]

6.各カテゴリの数を数える

const people = [
    {name: 'John', group: 'A'}, 
    {name: 'Andrew', group: 'C'}, 
    {name: 'Peter', group: 'A'}, 
    {name: 'James', group: 'B'}, 
    {name: 'Hanna', group: 'A'}, 
    {name: 'Adam', group: 'B'}];

const groupInfo = people.reduce((groups, person) => {
    const {A = 0, B = 0, C = 0} = groups;
    if (person.group === 'A') {
        return {...groups, A: A + 1};
    } else if (person.group === 'B') {
        return {...groups, B: B + 1};
    } else {
        return {...groups, C: C + 1};
    }
}, {});

console.log(groupInfo); // {A: 3, C: 1, B: 2}

7.特定の基準に基づいて配列のサブセットを取得する

const myArray = [{x:100}, {x:200}, {x:300}];

const newArray = myArray.filter(element => element.x > 250);
console.log(newArray); // [{x:300}] 

注:filter()メソッドは、提供された関数によって実装されたテストに合格したすべての要素を含む新しい配列を作成します。

8.配列をソートする

const people = [
  { name: "John", age: 21 },
  { name: "Peter", age: 31 },
  { name: "Andrew", age: 29 },
  { name: "Thomas", age: 25 }
];

let sortByAge = people.sort(function (p1, p2) {
  return p1.age - p2.age;
});

console.log(sortByAge);

ここに画像の説明を入力してください

9.配列の要素を見つける

const people = [ {name: "john", age:23},
                {name: "john", age:43},
                {name: "jim", age:101},
                {name: "bob", age:67} ];

const john = people.find(person => person.name === 'john');
console.log(john);

ここに画像の説明を入力してください

Array.prototype.find()メソッドは、指定されたテスト関数を満たす配列の最初の要素の値を返します。

参考文献


1
これは素晴らしい参照です-これはこの質問のオリジナルですか、またはこのようなものを他の場所でホストしていますか?
Salvatore

非常によく説明され、完全な答え、貢献していただきありがとうございます。
エリカサマーズ

こんにちは、すべての名前を表示してから比較を行う場合、その方法を知っていますか?
dipgirl

@dipgirl、それは以下のようなものですか?const people = [ {name: "john", age:23}, {name: "john", age:43}, {name: "jim", age:101}, {name: "bob", age:67} ]; const sortByAge = people.map(p => { console.log(p.name) return p }).sort(function (p1, p2) { return p1.age - p2.age; }); console.log(sortByAge);
Yuci

1
100回目の投票おめでとう:)
Syed

46

for..ofループを使用して、オブジェクトの配列をループできます。

for (let item of items) {
    console.log(item); // Will display contents of the object inside the array
}

最高のことの1つ for..ofループループが配列だけではなく反復できることです。マップやオブジェクトを含む、あらゆるタイプの反復可能オブジェクトを反復できます。古いブラウザをサポートする必要がある場合は、トランスパイラまたはTypeScriptなどを使用してください。

マップを反復処理する場合、構文は、キーと値の両方を処理することを除いて、上記とほとんど同じです。

for (const [key, value] of items) {
  console.log(value);
}

for..ofはJavascriptで行うほとんどすべての種類の反復にループを使用しています。さらに、最も優れた点の1つは、非同期/待機でも動作することです。



18

これを行う方法の例を次に示します。

var students = [{
    name: "Mike",
    track: "track-a",
    achievements: 23,
    points: 400,
  },
  {
    name: "james",
    track: "track-a",
    achievements: 2,
    points: 21,
  },
]

students.forEach(myFunction);

function myFunction(item, index) {
  for (var key in item) {
    console.log(item[key])
  }
}


track各要素のプロパティの値をどのように取得し、それを変数に割り当てて、コードの別の部分で使用または補間しますか?
Chris22

7

オブジェクトの配列をループすることは、かなり基本的な機能です。これは私にとってうまくいきます。

var person = [];
person[0] = {
  firstName: "John",
  lastName: "Doe",
  age: 60
};

var i, item;

for (i = 0; i < person.length; i++) {
  for (item in person[i]) {
    document.write(item + ": " + person[i][item] + "<br>");
  }
}


6

myArray[j.x] 論理的に正しくありません。

(myArray[j].x);代わりに使用

for (var j = 0; j < myArray.length; j++){
  console.log(myArray[j].x);
}

@ Cyborgx37ああ..つまり、jxは正しくない変数名として扱われます。
Vivek Sadh 2013年

5

ES5以降では、forEachメソッドを使用するのはとても簡単です。配列内の各オブジェクトの各プロパティを直接変更できます。

myArray.forEach(function (arrayElem){ 
  arrayElem = newPropertyValue;
});

各オブジェクトの特定のプロパティにアクセスする場合:

myArray.forEach(function (arrayElem){ 
      arrayElem.nameOfYourProperty = newPropertyValue;
    });

4

次に、オブジェクトの配列を反復処理する別の方法を示します(これらのドキュメントには、jQueryライブラリをドキュメントに含める必要があります)。

$.each(array, function(element) {
  // do some operations with each element... 
});

1
あなたの答えは、$.eachメソッドを使用するためにjQueryライブラリをロードする必要性に関する重要な情報が欠けていることです。
マシューモレク2016年

4

これはうまくいくでしょう。array(yourArray)をループします。次に、各オブジェクト(eachObj)の直接プロパティをループします。

yourArray.forEach( function (eachObj){
    for (var key in eachObj) {
        if (eachObj.hasOwnProperty(key)){
           console.log(key,eachObj[key]);
        }
    }
});

2

jQueryを使用した配列オブジェクトの反復(2番目のパラメーターを使用して文字列を出力します)。

$.each(array, function(index, item) {
       console.log(index, item);
});

2

var c = {
    myProperty: [
        { name: 'this' },
        { name: 'can' },
        { name: 'get' },
        { name: 'crazy' }
    ]
};

c.myProperty.forEach(function(myProperty_element) {
    var x = myProperty_element.name;
    console.log('the name of the member is : ' + x);
})

これは私がそれを達成した方法の1つです。


1

受け入れられた回答は通常の機能を使用します。したがって、forEachの矢印関数を使用して、わずかな変更を加えた同じコードを投稿

  yourArray.forEach(arrayItem => {
      var x = arrayItem.prop1 + 2;
      console.log(x);
  });

また$ .eachでは、以下のような矢印関数を使用できます

 $.each(array, (item, index) => {
       console.log(index, item);
 });

1

const jobs = [
    {
        name: "sipher",
        family: "sipherplus",
        job: "Devops"
    },
    {
        name: "john",
        family: "Doe",
        job: "Devops"
    },
    {
        name: "jim",
        family: "smith",
        job: "Devops"
    }
];

const txt = 
   ` <ul>
        ${jobs.map(job => `<li>${job.name} ${job.family} -> ${job.job}</li>`).join('')}
    </ul>`
;

document.body.innerHTML = txt;

バックティックに注意してください( `)


0

これは誰かを助けるかもしれません。多分それはノードのバグです。

var arr = [ { name: 'a' }, { name: 'b' }, { name: 'c' } ];
var c = 0;

これは機能しません:

while (arr[c].name) { c++; } // TypeError: Cannot read property 'name' of undefined

しかし、これはうまくいきます...

while (arr[c]) { c++; } // Inside the loop arr[c].name works as expected.

これも動作します...

while ((arr[c]) && (arr[c].name)) { c++; }

ただし、単に順序を逆にしても機能しません。Nodeを壊す何らかの内部最適化がここにあると思います。

while ((arr[c].name) && (arr[c])) { c++; }

エラーは、配列が未定義であると言いますが、それはそうではありません:-/ Node v11.15.0

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