551

私は JavaScript でオブジェクトを持っています:

{
    abc: '...',
    bca: '...',
    zzz: '...',
    xxx: '...',
    ccc: '...',
    // ...
}

forループを使用してそのプロパティを取得したい。そして、それを部分的に繰り返したいと思います(一度にすべてのオブジェクトプロパティではありません)。

単純な配列を使用すると、標準のforループで実行できます。

for (i = 0; i < 100; i++) { ... } // first part
for (i = 100; i < 300; i++) { ... } // second
for (i = 300; i < arr.length; i++) { ... } // last

しかし、オブジェクトでそれを行う方法は?

4

18 に答える 18

1095

ほとんどのオブジェクトでは、次を使用しますfor .. in

for (let key in yourobject) {
  console.log(key, yourobject[key]);
}

ES6 では、キーと値の両方が同時に必要な場合は、

for (let [key, value] of Object.entries(yourobject)) {
    console.log(key, value);
}

継承されたプロパティをログに記録しないようにするには、hasOwnPropertyで確認します。

for (let key in yourobject) {
   if (yourobject.hasOwnProperty(key)) {
      console.log(key, yourobject[key]);
   }
}

hasOwnProperty単純なオブジェクト (たとえば、自分で作成したもの) を使用している場合は、キーを反復処理するときにチェックする必要はありません{}

この MDN ドキュメントでは、オブジェクトとそのプロパティを扱う方法をより一般的に説明しています。

「チャンクで」実行したい場合は、配列内のキーを抽出するのが最善です。順序が保証されていないため、これが適切な方法です。最新のブラウザでは、使用できます

let keys = Object.keys(yourobject);

互換性を高めるには、次のようにすることをお勧めします。

 let keys = [];
 for (let key in yourobject) {      
     if (yourobject.hasOwnProperty(key)) keys.push(key);
 }

yourobject[keys[i]]次に、 index :によってプロパティを反復処理できます。

for (let i=300; i < keys.length && i < 600; i++) { 
   console.log(keys[i], yourobject[keys[i]]);
}
于 2013-01-17T12:37:59.373 に答える
84

最新のブラウザー向けの別の反復ソリューションを次に示します。

Object.keys(obj)
  .filter((k, i) => i >= 100 && i < 300)
  .forEach(k => console.log(obj[k]));

またはフィルター機能なし:

Object.keys(obj).forEach((k, i) => {
    if (i >= 100 && i < 300) {
        console.log(obj[k]);
    }
});

ただし、JavaScript オブジェクトのプロパティはソートされていない、つまり順序​​がないことを考慮する必要があります。

于 2013-01-17T12:40:29.600 に答える
19

新しい ES6/ES2015 機能により、オブジェクトを使用してハッシュを反復処理する必要がなくなりました。Mapを使用できます。Javascript マップはキーを挿入順に保持します。つまり、hasOwnProperty をチェックすることなくキーを反復処理できますが、これは常に実際にはハックでした。

マップを反復処理します。

var myMap = new Map();
myMap.set(0, "zero");
myMap.set(1, "one");
for (var [key, value] of myMap) {
  console.log(key + " = " + value);
}
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

for (var key of myMap.keys()) {
  console.log(key);
}
// Will show 2 logs; first with "0" and second with "1"

for (var value of myMap.values()) {
  console.log(value);
}
// Will show 2 logs; first with "zero" and second with "one"

for (var [key, value] of myMap.entries()) {
  console.log(key + " = " + value);
}
// Will show 2 logs; first with "0 = zero" and second with "1 = one"

または forEach を使用します。

myMap.forEach(function(value, key) {
  console.log(key + " = " + value);
}, myMap)
// Will show 2 logs; first with "0 = zero" and second with "1 = one"
于 2016-08-04T03:42:06.893 に答える
8

これを行う唯一の信頼できる方法は、オブジェクト データを 2 つの配列 (キーの 1 つとデータの 1 つ) に保存することです。

var keys = [];
var data = [];
for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        keys.push(key);
        data.push(obj[key]); // Not necessary, but cleaner, in my opinion. See the example below.
    }
}

その後、通常のように配列を反復処理できます。

for(var i = 0; i < 100; i++){
    console.log(keys[i], data[i]);
    //or
    console.log(keys[i], obj[keys[i]]); // harder to read, I think.
}
for(var i = 100; i < 300; i++){
    console.log(keys[i], data[i]);
}

Object.keys(obj)それはIE 9+であるため、私は使用していません。

于 2013-01-17T12:44:30.847 に答える
1

オブジェクト全体を一度に繰り返したい場合は、for inループを使用できます。

for (var i in obj) {
  ...
}

しかし、オブジェクトをパーツに分割したい場合は、実際にはできません。オブジェクト内のプロパティが指定された順序であるという保証はありません。したがって、2つの解決策を考えることができます。

それらの最初は、既に読み取られたプロパティを「削除」することです。

var i = 0;
for (var key in obj) {
    console.log(obj[key]);
    delete obj[key];
    if ( ++i > 300) break;
}

私が考えることができる別の解決策は、オブジェクトの代わりに配列の配列を使用することです:

var obj = [['key1', 'value1'], ['key2', 'value2']];

その後、標準forループが機能します。

于 2013-01-17T12:48:13.667 に答える
1
<script type="text/javascript">
// method 1
var images = {};
images['name'] = {};
images['family'] = {};
images[1] = {};
images['name'][5] = "Mehdi";
images['family'][8] = "Mohammadpour";
images['family']['ok'] = 123456;
images[1][22] = 2602;
images[1][22] = 2602;
images[1][22] = 2602;
images[1][22] = 2602;
images[1][23] = 2602;

for (const [key1, value1] of Object.entries(images)){
    for (const [key2, value2] of Object.entries(value1)){
        console.log(`${key1} => ${key2}: ${value2}`);
    }
}


console.log("=============================");

// method 2
var arr = [];
for(var x = 0; x < 5; x++){
     arr[x] = [];    
     for(var y = 0; y < 5; y++){ 
         arr[x][y] = x*y;    
     }    
 }

for(var i = 0; i < arr.length; i++) {
    var cube = arr[i];
    for(var j = 0; j < cube.length; j++) {
        console.log("cube[" + i + "][" + j + "] = " + cube[j]);
    }
}

</script>
于 2020-08-26T06:21:42.870 に答える
0
var Dictionary = {
  If: {
    you: {
      can: '',
      make: ''
    },
    sense: ''
  },
  of: {
    the: {
      sentence: {
        it: '',
        worked: ''
      }
    }
  }
};

function Iterate(obj) {
  for (prop in obj) {
    if (obj.hasOwnProperty(prop) && isNaN(prop)) {
      console.log(prop + ': ' + obj[prop]);
      Iterate(obj[prop]);
    }
  }
}
Iterate(Dictionary);
于 2016-07-03T22:51:51.777 に答える
0

本当に PITA これは標準 Javascript の一部ではありません。

/**
 * Iterates the keys and values of an object.  Object.keys is used to extract the keys.
 * @param object The object to iterate
 * @param fn (value,key)=>{}
 */
function objectForEach(object, fn) {
    Object.keys(object).forEach(key => {
        fn(object[key],key, object)
    })
}

注: コールバック パラメータを (value,key) に切り替え、API を他の API と一致させるために 3 つ目のオブジェクトを追加しました。

このように使用してください

const o = {a:1, b:true};
objectForEach(o, (value, key, obj)=>{
    // do something
});
于 2018-04-28T02:14:02.627 に答える