2010-09-23 16 views
20

J'apprends JavaScript en utilisant le W3C et je n'ai pas trouvé de réponse à cette question. J'essaye de faire quelques manipulations sur les éléments de tableau qui remplissent certaines conditions.JavaScript - Obtenir l'élément de tableau remplissant une condition

Existe-t-il un moyen de le faire autrement que sur les éléments du tableau dans la boucle for? Peut-être quelque chose comme (dans d'autres langues):

foreach (object t in tArray) 
    if (t follows some condition...) t++; 

une autre chose, parfois, je veux utiliser la valeur de l'élément et parfois, je veux l'utiliser comme référence. Quelle est la différence syntaxique?

En outre, je serai heureux pour les recommandations sur des sites plus vastes pour apprendre le JavaScript de. grâce

+0

Pour apprendre Javascript, essayez: [Mozilla Developer Center] (https://developer.mozilla.org/en/JavaScript) et le [Programme d'études des normes Web] (http://dev.opera.com/articles/view/programming-the-real-basics/) –

Répondre

19

Dans la plupart des navigateurs (pas IE < = 8) les tableaux ont une méthode filter, qui ne fait pas tout à fait ce que vous voulez, mais vous ne créez un tableau d'éléments du tableau d'origine qui satisfont une certaine condition:

function isGreaterThanFive(x) { 
    return x > 5; 
} 

[1, 10, 4, 6].filter(isGreaterThanFive); // Returns [10, 6] 

Mozilla Developer Network a beaucoup de bonnes ressources JavaScript.

+1

Je voulais juste ajouter qu'il a été ajouté à IE à partir de la version 9. –

+0

@MiikaL. Bon point, merci. J'ai mis à jour ma réponse. –

2

Vous pouvez utiliser for ... in en JavaScript:

for (var key in array) { 
    if (/* some condition */) { 
     // ... 
    } 
} 

Comme de JavaScript 1.6, vous pouvez l'utiliser aussi:

for each (var element in array) { 
    // ... 
} 

Ceux-ci sont destinés principalement à traverser des propriétés d'objet. Vous devriez envisager d'utiliser simplement votre for -loop.

EDIT: Vous pouvez utiliser un framework JavaScript tel que jQuery pour éliminer ces problèmes entre navigateurs. Essaie. Son $.each()-method fait le travail.

+0

Certes, ces méthodes fonctionnent, mais elles sont souvent déconseillées. La raison en est qu'il énumère également d'autres propriétés de l'objet tableau (et beaucoup de bibliothèques ajoutent de telles propriétés) qui produiront des résultats imprévisibles. – sje397

+0

@ sje397: C'est vrai. Je recommande fortement jQuery pour cela. Son ['$ .each()' -method] (http://api.jquery.com/jQuery.each/) fonctionne très bien et fournit des fermetures. Puisque JavaScript a une portée de fonction, cela peut être très utile lorsque vous faites beaucoup de choses dans vos boucles. – jwueller

+0

L'ensemble réel des propriétés énumérées par 'for ... in' est entièrement prévisible, bien qu'il varie d'un navigateur à l'autre. Ce qui n'est généralement pas prévisible est l'ordre d'itération. Pour itérer sur un tableau, 'for ... in' est généralement une mauvaise idée. –

1

A propos des tableaux

Qu'est-ce que vous voulez généralement pour itérer sur tableau est la méthode forEach:

arr.forEach(function(el) { 
    alert(el); 
}); 

Dans votre cas pour incrémenter chaque élément du tableau, je vous recommande la méthode map :

arr = arr.map(function(t){ return t+1; }); 

Il existe également filter, reduce, et d'autres, qui sont également utiles.

Mais comme Tim Down déjà mentionné, ceux-ci ne fonctionnera pas par défaut dans IE. Mais vous pouvez aussi facilement ajouter ces méthodes pour IE, comme indiqué dans la documentation MDC, ou en fait vous pouvez même écrire des versions plus simples que celles de la documentation MDC (je ne sais pas pourquoi elles sont si peu JavaScript):

if (!Array.prototype.forEach) { 
    Array.prototype.forEach = function(func, scope) { 
    for (var i = 0, len = this.length; i < len; i++) { 
     func.call(scope, this[i], i, this); 
    } 
    }; 
} 

Mais ne pas utiliser la for ... in construction pour les tableaux - c'est destiné à des objets.

A propos des références

Une autre chose, parfois, je veux utiliser la valeur de l'élément et parfois je veux l'utiliser comme référence. Quelle est la différence syntaxique?

En JavaScript, chaque variable est en fait une référence à un objet. Mais ces références sont transmises par la valeur. Laissez-moi vous expliquer ...

Vous pouvez passer un objet à une fonction qui modifie l'objet et les changements seront vu en dehors de la fonction:

function incrementHeight(person) { 
    person.height = person.height + 1; 
} 
var p = {height: 10); 
alert(p.height); // outputs: 10 
incrementHeight(p); 
alert(p.height); // outputs: 11 

Ici vous modifiez la valeur à laquelle les points de référence person et ainsi le changement sera reflété en dehors de la fonction.

Mais quelque chose comme ceci échoue:

function incrementHeight(height) { 
    height = height + 1; 
} 
var h = 10; 
alert(h); // outputs: 10 
incrementHeight(h); 
alert(h); // outputs: 10 

Ici vous créez un tout nouvel objet 11 et d'assigner la référence à la variable height. Mais la variable h en dehors de la fonction contient toujours l'ancienne référence et reste donc à pointer sur 10.

0

Juste rencontré le même problème. Tim Down est venu près, il a juste besoin d'un emballage à la longueur du tableau filtré:

// count elements fulfilling a condition 
Array.prototype.count = function (f) { 
    return this.filter(f).length; 
}; 

Utilisation:

// get the answer weight from the question's values array 
var w = Math.pow(q.values.count(function(v) { return v !== -1; }), -1); 

J'espère que les réponses à cette question de longue date!

2

Voici un court chemin pour écrire un filtre. D'un tableau de nombres, il retourne toutes les valeurs supérieures à 5.

myArray.filter((x) => { return x > 5; }) 

Exemple d'utilisation:

var filterResult = [1, 10, 4, 6].filter((x) => { return x > 5; }); 
console.log(filterResult); // returns [ 10, 6 ] 

Et ici un filtre pour un tableau de objets, qui vérifie une propriété état .

myArray.filter((x) => { return x.myNumber > 5; }) 

Exemple d'utilisation:

var myArray = [{myNumber: 1, name: 'one'}, {myNumber: 3, name: 'tree'}, {myNumber: 6, name: 'six'}, {myNumber: 8, name: 'eight'}]; 
var result = myArray.filter((x) => { return x.myNumber > 5; }); 
console.log(result); // returns [ { myNumber: 6, name: 'six' }, { myNumber: 8, name: 'eight' } ]