forループでオブジェクトを使用できないのはなぜですか?それともこれはブラウザのバグですか?このコードはChrome42では機能せず、undefinedは関数ではないと言っています。
test = { first: "one"}
for(var item of test) {
console.log(item)
}
forループでオブジェクトを使用できないのはなぜですか?それともこれはブラウザのバグですか?このコードはChrome42では機能せず、undefinedは関数ではないと言っています。
test = { first: "one"}
for(var item of test) {
console.log(item)
}
回答:
ループfor..ofだけでなく、オブジェクト、配列などの反復可能なオブジェクトをサポートしています。
オブジェクトの値を反復処理するには、次を使用します。
for (var key in test) {
var item = test[key];
}
.iterable
メンバー関数があります。これは、オブジェクト(オブジェクトがない)で使用しようとしたときにエラーが発生する場所です。developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
if (test.hasOwnProperty(key)){ ... }
ませんか?それともそれは必要ありませんか?
次の構文を使用できます。
let myObject = {first: "one"};
for(let [key, value] of Object.entries(myObject)) {
console.log(key, value); // "first", "one"
}
しかしながら、 Object.entries
現在サポートが不十分です IEでは機能しません またはiOSSafari。あなたは多分 ポリフィルが必要な場合があります。
Key-Valueストアにデータを保存する場合は、この目的のために明示的に設計されたものを使用しMap
てください。
ただし、オブジェクトを使用する必要がある場合は、ES2017(ES8)で次のものを使用できますObject.values
。
const foo = { a: 'foo', z: 'bar', m: 'baz' };
for (let value of Object.values(foo)) {
console.log(value);
}
それはまだサポートされていない場合は、ポリフィルを使用:するための別のバージョンをObject.values()
そして最後に、この構文をサポートしていない古い環境をサポートしている場合は、forEach
andを使用する必要がありますObject.keys
。
var obj = { a: 'foo', z: 'bar', m: 'baz' };
Object.keys(obj).forEach(function (prop) {
var value = obj[prop];
console.log(value);
});
Object.entries
プロトタイプに触れることなくポリフィルすることができます。
for-in
か?
ECMAScript 2015 / ES6のIterator、Iterable、およびfor..ofループ
let tempArray = [1,2,3,4,5];
for(element of tempArray) {
console.log(element);
}
// 1
// 2
// 3
// 4
// 5
しかし、私たちがそうするなら
let tempObj = {a:1, b:2, c:3};
for(element of tempObj) {
console.log(element);
}
// error
for..ofループはIterables、つまりIteratorプロトコルに準拠する@@ iteratorを持つオブジェクトでのみ機能するため、エラーが発生します。つまり、次のメソッドを持つオブジェクトが必要です。次のメソッドは引数をとらず、これら2つのプロパティを持つオブジェクトを返す必要があります。
完了:trueの場合にシーケンスが終了したことを示し、falseはより多くの値がある可能性があることを意味します value:これはシーケンスの現在の項目です
したがって、オブジェクトをIterableにすること、つまり、オブジェクトをfor..ofで動作させることは、次のことができます。
1 .MakeオブジェクトのIterable神秘のITに割り当てることによって@@イテレータ を介してプロパティSymbol.iterator property.Hereの方法です:
let tempObj = {a:1, b:2, c:3};
tempObj[Symbol.iterator]= () => ({
next: function next () {
return {
done: Object.keys(this).length === 0,
value: Object.keys(this).shift()
}
}
})
for(key in tempObj){
console.log(key)
}
// a
// b
// c
2.Use Object.entries戻り、反復処理可能に:
let tempObj = {a:1, b:2, c:3};
for(let [key, value] of Object.entries(tempObj)) {
console.log(key, value);
}
// a 1
// b 2
// c 3
3.Object.keysを使用しますます。方法は次のとおりです。
let tempObj = {a:1, b:2, c:3};
for (let key of Object.keys(tempObj)) {
console.log(key);
}
// a
// b
// c
お役に立てれば!!!!!!
このコードでオブジェクトを反復可能にしました:
Object.prototype[Symbol.iterator] = function*() {
for(let key of Object.keys(this)) {
yield([ key, this[key] ])
} }
使用法:
for(let [ key, value ] of {}) { }
代わりに:
for(let [ key, value ] of Object.entries({})) { }
オブジェクトリテラルにはSymbol.iteratorプロパティがないためです。具体的には、String、Array、Map、Set、arguments、NodeList(広くサポートされていない)、および for ... ofループを使用したGeneratorに対してのみ反復できます。
オブジェクトリテラルの反復を処理するには、2つのオプションがあります。
for(let key in obj){
console.log(obj[key]);
}
Object.keys(obj).forEach(function(key){
console.log(obj[key]);
});
答えは「いいえ」です。オブジェクトリテラルでFor..Ofを使用することはできません。
For..Ofは反復可能のみであるというOvervに同意します。オブジェクトを使用してfor..inでキーと値を反復処理するため、まったく同じ質問がありました。しかし、私はちょうどそれがES6ものだと認識MAPSとセットがためのものです。
let test = new Map();
test.set('first', "one");
test.set('second', "two");
for(var item of test) {
console.log(item); // "one" "two"
}
したがって、for..In(hasOwnPropertyで検証)を使用する必要がなく、Object.keys()を使用する必要がないという目標を達成します。
さらに、キーは文字列に限定されません。数字、オブジェクト、またはその他のリテラルを使用できます。
オブジェクトリテラルには、for...of
ループを操作するために必要な組み込みのイテレータがありません。ただし、[Symbol.iterator]
オブジェクトに独自のオブジェクトを追加する手間をかけたくない場合は、このObject.keys()
メソッドを使用するだけで済みます。このメソッドは、Array
すでにイテレータが組み込まれているオブジェクトを返すため、次のfor...of
ようなループで使用できます。
const myObject = {
country: "Canada",
province: "Quebec",
city: "Montreal"
}
for (let i of Object.keys(myObject)) {
console.log("Key:", i, "| Value:", myObject[i]);
}
//Key: country | Value: Canada
//Key: province | Value: Quebec
//Key: city | Value: Montreal
任意のオブジェクトに対してイテレータを定義することが可能です。このようにして、オブジェクトごとに異なるロジックを配置できます。
var x = { a: 1, b: 2, c: 3 }
x[Symbol.iterator] = function* (){
yield 1;
yield 'foo';
yield 'last'
}
次に、直接繰り返します x
for (let i in x){
console.log(i);
}
//1
//foo
//last
Object.prototype
オブジェクトに対して同じことを行うことが可能であり、すべてのオブジェクトに対して一般的なイテレータがあります
Object.prototype[Symbol.iterator] = function*() {
for(let key of Object.keys(this)) {
yield key
}
}
次に、このようにオブジェクトを繰り返します
var t = {a :'foo', b : 'bar'}
for(let i of t){
console.log(t[i]);
}
またはこのように
var it = t[Symbol.iterator](), p;
while(p = it.next().value){
console.log(t[p])
}
Object.keysを使用してキーの配列を取得するのはどうですか?そして、配列上のforEach?
obj = { a: 1, b:2}
Object.keys(obj).forEach( key => console.log(`${key} => ${obj[key]}`))
使用するのはどうですか
function* entries(obj) {
for (let key of Object.keys(obj)) {
yield [key, obj[key]];
}
}
for ([key, value] of entries({a: "1", b: "2"})) {
console.log(key + " " + value);
}
ES6では、ジェネレーターを使用できます。
var obj = {1: 'a', 2: 'b'};
function* entries(obj) {
for (let key of Object.keys(obj)) {
yield [key, obj[key]];
}
}
let generator = entries(obj);
let step1 = generator.next();
let step2 = generator.next();
let step3 = generator.next();
console.log(JSON.stringify(step1)); // {"value":["1","a"],"done":false}
console.log(JSON.stringify(step2)); // {"value":["2","b"],"done":false}
console.log(JSON.stringify(step3)); // {"done":true}
これがjsfiddleです。
出力では"value"
、"done"
キーとキーを持つオブジェクトを取得します。"Value"
あなたがすべて含まれていたい、それが持っているのと"done"
BOOLにおける反復の現在の状態です。