index - javascript foreach



Utilisation d'objets dans des boucles for (10)

Pourquoi n'est-il pas possible d'utiliser des objets dans des boucles for? Ou est-ce un bug de navigateur? Ce code ne fonctionne pas dans Chrome 42, affirmant que non défini n'est pas une fonction:

test = { first: "one"}

for(var item of test) {
  console.log(item)
}

https://src-bin.com


Answer #1

Itérateur, Itérable et pour .. de la boucle dans ECMAScript 2015 / ES6

let tempArray = [1,2,3,4,5];

for(element of tempArray) {
  console.log(element);
}

// 1
// 2
// 3
// 4
// 5

Mais si nous faisons

let tempObj = {a:1, b:2, c:3};

for(element of tempObj) {
   console.log(element);
}
// error

Nous obtenons une erreur car for..of ne fonctionne que sur Iterables , c'est-à-dire l'objet qui possède un itérateur @@ qui respecte le protocole Iterator , ce qui signifie qu'il doit avoir un objet avec une méthode next . La méthode suivante ne prend aucun argument et devrait renvoyer un objet avec ces deux propriétés.

done : indique que la séquence est terminée quand true et false signifie qu'il peut y avoir plus de valeurs value : il s'agit de l'élément en cours dans la séquence

Donc, pour faire un objet itérable, c’est le faire fonctionner pour, on peut:

1. Créez un objet un Iterable en lui attribuant sa propriété mystique @@ iterator via la propriété Symbol.iterator . Voici comment:

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. Utilisez Object.entries , qui renvoie un Iterable :

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.Utilisez Object.keys , voici comment:

let tempObj = {a:1, b:2, c:3};
for (let key of Object.keys(tempObj)) {
    console.log(key);
}

// a
// b
// c

J'espère que cela t'aides!!!!!!


Answer #2

À l'aide de la destruction de forEach vous pouvez l'itérer comme suit en utilisant forEach

const obj = { a: 5, b: 7, c: 9 };

Object.entries(obj).forEach(([key, value]) => {
  console.log(`${key} ${value}`); // "a 5", "b 7", "c 9"
});

Answer #3

J'ai créé des objets itérables avec ce code:

Object.prototype[Symbol.iterator] = function*() {
 for(let key of Object.keys(this)) {
  yield([ key, this[key] ])
} }

Usage:

for(let [ key, value ] of {}) { }

Alternativement:

for(let [ key, value ] of Object.entries({})) { }

Answer #4

Je viens de faire ce qui suit pour consoler facilement mes affaires.

for (let key in obj) {
  if(obj.hasOwnProperty(key){
    console.log(`${key}: ${obj[key]}`);
  }
}

Answer #5

La réponse est non. Il n'est pas possible d'utiliser For..Of avec des littéraux d'objet.

Je suis d'accord avec Overv que For..Of est uniquement pour iterables. J'avais exactement la même question parce que j'utilise des objets pour parcourir des clés et des valeurs avec for..in. Mais je viens de me rendre compte que c’est à cela que servent ES6 MAPS et Set .

let test = new Map();
test.set('first', "one");
test.set('second', "two");

for(var item of test) {
  console.log(item); // "one" "two"
}

Par conséquent, l'objectif est de ne pas avoir à utiliser for..In (validation avec hasOwnProperty ) et de ne pas utiliser Object.keys ().

De plus, vos clés ne sont pas limitées à des chaînes. Vous pouvez utiliser des nombres, des objets ou d'autres littéraux.


Answer #6

Les littéraux d'objet ne possèdent pas d'itérateurs intégrés, qui sont nécessaires pour travailler avec for...of boucles. Toutefois, si vous ne souhaitez pas ajouter votre propre [Symbol.iterator] à votre objet, vous pouvez simplement utiliser la méthode Object.keys() . Cette méthode retourne un objet Array , qui a déjà un itérateur intégré, vous pouvez donc l'utiliser avec une boucle for...of comme ceci:

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

Answer #7

Pourquoi ne pas utiliser Object.keys pour obtenir un tableau de clés? Et ensuite pour Array ?

obj = { a: 1, b:2}
Object.keys(obj).forEach( key => console.log(`${key} => ${obj[key]}`))

Answer #8

Qu'en est-il d'utiliser

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

Answer #9

Vous pouvez utiliser cette syntaxe:

const foo = { a: 'foo', z: 'bar', m: 'baz' };
for (let value of Object.values(foo)) {
    console.log(value);
}

Cependant, Object.entries a un faible soutien en ce moment ne fonctionne pas dans IE ou iOS Safari . Vous allez Probablement pourrait avoir besoin d'un polyfill.


Answer #10

dans ES6, vous pouvez utiliser un générateur:

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}

Voici le jsfiddle. Dans la sortie, vous obtiendrez un objet avec les touches "value" et "done" . "Value" contient tout ce que vous voulez et "done" est l'état actuel de l'itération en bool.





iterable