2011-07-23 2 views
2

Je voudrais savoir s'il est possible de créer un tableau et de l'initialiser avec le même objet sans devoir boucler sur chaque élément. Je ne veux pas faire de boucle parce que je pourrais avoir à insérer beaucoup d'élément. ce que je voudrais être en mesure de le faire:JavaScript - Créer un tableau avec des données sans bouclage

var array=new Array(10000); 

et je voudrais que chaque élément du tableau est le même objet (autre que non défini :)) sans avoir à faire comme ce

for(i=0;i<array.length;i++) 
    array[i]=object; 

J'espère que je veux faire est clair pour vous

je suis venu avec une solution mais j'utilise la fonction eval donc je ne sais pas si c'est le meilleur, mais beaucoup plus efficace qu'une boucle

Votre conseille sont les bienvenus :)

voici comment

var i="l,",l=new Object(),length=20000; 
l.id=1; 

while(i.length<length){ 
     i+=i; 
} 
i=i.substring(0,length-1); 
i="["+i+"]"; 

var array=eval(i); 

console.log(array); 

grâce

+1

Votre solution a une boucle while. – Gaurav

+0

Oui mais je ne boucle pas 10000 fois, pour 10000 éléments je boucle seulement 14 fois ce qui est beaucoup plus efficace. – al7iss

Répondre

3

Il n'y a pas d'obligation pour les tableaux de JS pour allouer de la mémoire pour les éléments lorsque vous new Array(10000); vous obtenez des éléments non définis simplement parce qu'il n'y a pas de tels éléments - même pas de stockage pour eux alloués. Pour créer des éléments du tableau, vous devez les mettre explicitement.

Mais pour être honnête, je ne comprends pas pourquoi vous en avez besoin. Il suffit de mettre ceci:

var v = array[i] || object; 

Et v aura toujours une ou l'autre élément ou l'objet si l'élément n'a pas été défini.

+0

merci pour votre réponse. – al7iss

+0

merci pour votre réponse mais ce dont j'ai besoin c'est que tous les éléments du tableau soient les mêmes mais pas indéfinis. J'ai besoin de cela parce que je vais modifier la potion de tableau par portion. Il ne semble pas être faisable, je vais devoir faire une boucle sur le tableau qui diminuera malheureusement les performances. – al7iss

+1

Ajoutez simplement une paire de fonctions get/set à votre tableau comme 'myArr.get = function (i) {return this [i] || objet; } 'et les utiliser à la place de' [] 'accesseur. –

1

Non et oui @see array spec.

Non, comme dans JS il n'y a pas constructeur comme:

var a = new Array(10000, someObject); 
// or 
var a = Array.fill(0, 10000, someObject); 

Oui, comme vous pouvez le faire manuellement :)

var a = new Array(someObject, someObject, someObject, ..., someObject); // 9996 elements ommited 

Et vous codez il vaut mieux faites comme ceci:

for (var i = 0, iMax = array.length; i < iMax; i++) { 
    array[i]=object; 
} 
  1. Ajouter var intérieur pour de contre l'initialisation
  2. Utilisez une autre variable locale au lieu de array.length, comme un peu plus dans le champ
+0

Oui, j'ai pensé à votre solution, mais la création de la matrice est faite dynamiquement et sa longueur est obtenue à partir d'un serveur, donc ce n'est pas toujours la même chose.Merci – al7iss

1

Il n'y a pas de fonctionnalité intégrée dans js mais vous pouvez créer un toi; Oui iam boucle à l'intérieur de la fonction myArray.

function myArray(size,defaultObj) 
{ 
    var _array=[]; 
    for (i=0;i<size;i++) 
    { 
     _array[i]=defaultObj 
    } 
    return _array; 
} 

var myArray= myArray(3,"hello"); 

alert(myArray[2]); 

http://jsfiddle.net/ZySst/

+0

Juste une petite solution élégante est ici: http://jsfiddle.net/Ng3g2/ – gaRex

-1

Probablement pas une solution pratique, et ne fonctionnera pas dans IE 9 <, mais techniquement pas de boucle (explicite):

var a = []; 
a.length = 10000; 
a.forEach(function(e, i) { 
    a[i] = object; 
}); 
+0

Oui mais est-il plus efficace que le bouclage? – al7iss

+0

Comme je l'ai dit, pas pratique. – Gaurav

+0

Hey, pourquoi les downvotes? La question était: est-ce possible? La réponse est (techniquement) oui. – Gaurav

0

Non, je ne pense pas c'est possible dans JavaScript en vanille.

Ce code va créer un Array contenant 10 zéros:

var array = [ ] , filler = 1 ; 
var i = 0 , length = 10 ; 

while(i < length) array.push(filler) , i = i + 1; 

alert("(!) array >> " + array) ; 

(try it here)

0

C'est la meilleure solution que je trouve, ne pas utiliser eval et la boucle ne soit pas trop longue pour le navigateur ne plante pas:

var j=0,l=new Object(); 
l.id=1 
var array=[l]; 

while(array.length<10000){ 
    array=array.concat(array); 
} 
array=array.slice(0,10000); 
console.log(array.length); 

Bien sûr, plus la longueur du tableau est grande avant la boucle, plus la boucle est rapide.

+0

Par curiosité, avez-vous essayé certains des modèles les plus simples en utilisant Array # push ou l'opérateur de support en termes de performance. Cette approche semble tbh un peu compliquée. En outre, Array # concat crée un nouveau tableau avec chaque appel (https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/concat) qui semble être une chose inutile. – FK82

1

Je pense que c'est ce que vous cherchez!

function createMatrix() 
     { 
     var matrix = Array.prototype.slice.call(arguments); 
     return matrix.length > 0 ? matrix : [0] ; 
     } 

créer la matrice de createMatrix dimension arbitraire() -> [0]
createMatrix (1, 2, 3) -> [1,2,3] - vecteur ligne

createMatrix ([1], [2], [3]) -> [[1], [2], [3]] - vecteur colonne

createMatrix ( [1, 2, 3], [ 4, 5, 6], [7, 8, 9] )

-> [[1,2,3], [4,5,6], [7,8,9]] - 3 × 3 matrice

0

Je dirais que la réponse à votre question est: cela ne peut pas être fait.

Pas en Java, et probablement pas dans un autre langage de programmation. Si vous pensez à la machine sous-jacente, ce que vous demandez est: peut-on initialiser une zone de mémoire de n valeurs d'un type spécifique à la même valeur sans bouclage.

Et je suppose que cela n'est possible sans une boucle s'il y a un mécanisme spécial dans la machine sous-jacente, par ex. un moyen d'annuler les zones de mémoire. Mais même dans ce cas, dans la plupart des cas, le mécanisme boucle sur toutes les valeurs.

1

Je pense que vous pouvez faire quelque chose comme ci-dessous, j'ai essayé de remplir 50 1 sans utiliser de boucle, mais je pense que divisé en interne et joindre les deux utilisations boucle.

var a = new Array(50).join(1).split('').join(','); 
0

Voici ma solution!

Ceci est vraiment la manière No Loop de créer Array!

const createNoLoopArray = (m, n) => { 
 
    let arr = new Array(m+1); 
 
    // let arr = []; 
 
    // arr.length = m; 
 
    return arr.join(n).split('').map((value) => parseInt(value, 10)); 
 
} 
 

 
let result = createNoLoopArray(7, 3); 
 
console.log(result); 
 

 
// (7) [3, 3, 3, 3, 3, 3, 3]

+0

ou tout comme ces deux codes de lignes! 'const createNoLoopArray = (m, n) => nouveau tableau (m + 1) .join (n) .split (''). map ((valeur) => parseInt (valeur, 10));' & ' console.log (createNoLoopArray (7, 3)); ' – xgqfrms

Questions connexes