web-dev-qa-db-fra.com

Nombre d'éléments de tableau "définis"

Étant donné le tableau suivant:

var arr = [undefined, undefined, 2, 5, undefined, undefined];

Je voudrais obtenir le nombre d'éléments qui sont définis (c'est-à-dire: ceux qui sont pas undefined). Existe-t-il un autre moyen de faire cela en boucle?

32
Erik

Dans les navigateurs récents, vous pouvez utiliser filter

var size = arr.filter(function(value) { return value !== undefined }).length;

console.log(size);

Une autre méthode, si le navigateur prend en charge indexOf pour les tableaux:

var size = arr.slice(0).sort().indexOf(undefined);

Si pour absurde vous avez des éléments à un chiffre seulement dans le tableau, vous pouvez utiliser ce truc sale:

console.log(arr.join("").length);

Vous pouvez utiliser plusieurs méthodes, mais à la fin, nous devons voir si cela vaut vraiment la peine de les faire au lieu d’une boucle.

57
ZER0

Un tableau length n'est pas le nombre d'éléments dans un tableau, c'est le index + 1 le plus élevé. La propriété length ne signalera le nombre d'éléments correct que s'il existe des éléments valides dans des index consécutifs. 

var a = [];
a[23] = 'foo';
a.length;  // 24

Cela dit, il n’existe aucun moyen d’exclure des éléments non définis sans utiliser une forme quelconque de boucle.

10
taskinoor

Non, le seul moyen de savoir combien d'éléments ne sont pas indéfinis est de les parcourir en boucle et de les compter. Cela ne signifie pas que vous devez écrire la boucle, cependant, quelque chose, quelque part, doit le faire. (Voir n ° 3 ci-dessous pour savoir pourquoi j'ai ajouté cette mise en garde.)

Vous décidez comment les parcourir et les compter. Il y a beaucoup de façons:

  1. Une boucle for standard allant de 0 à arr.length - 1 (inclus).
  2. Une boucle for..inà condition que vous preniez les mesures de protection appropriées .
  3. Plusieurs des nouvelles fonctionnalités de la matrice ECMAScript5 (à condition que vous utilisiez un moteur JavaScript qui les prenne en charge, ou que vous ayez inclus un shim ES5, car ils sont tous adaptables), comme some _ , filter , ou reduce , en passant une fonction appropriée. C'est pratique, non seulement parce que vous n'avez pas à écrire explicitement la boucle, mais parce que l'utilisation de ces fonctionnalités donne au moteur JavaScript la possibilité d'optimiser la boucle qu'il effectue en interne de différentes manières. (Le fait que do varie en fonction du moteur.)

... mais tout revient à boucler, explicitement ou implicitement (dans le cas des nouvelles fonctionnalités de tableau).

2
T.J. Crowder

Si les indéfinis sont implicites, vous pouvez faire:

var len = 0;
for (var i in arr) { len++ };

les indéfinis sont implicites si vous ne les définissez pas explicitement

//both are a[0] and a[3] are explicit undefined
var arr = [undefined, 1, 2, undefined];

arr[6] = 3;
//now arr[4] and arr[5] are implicit undefined

delete arr[1]
//now arr[1] is implicit undefined

arr[2] = undefined
//now arr[2] is explicit undefined
0
Jonathan.

Supprimez les valeurs puis vérifiez (supprimez la vérification null ici si vous voulez)

const x = A.filter(item => item !== undefined || item !== null).length

Avec Lodash

const x = _.size(_.filter(A, item => !_.isNil(item)))
0
Luke Robertson

Boucle et compte dans tous les navigateurs:

var cnt = 0;
for (var i = 0; i < arr.length; i++) {
    if (arr[i] !== undefined) {
        ++cnt;
    }
}

Dans les navigateurs modernes:

var cnt = 0;
arr.foreach(function(val) {
    if (val !== undefined) { ++cnt; }
})
0
jfriend00