2014-03-19 11 views
6

Ich stelle mir vor, das ist ähnlich Array Padding, aber ich frage mich, ob es überhaupt vereinfacht werden kann.JavaScript: Wie x x zu einem Array hinzufügen?

var arr = [1,2,3], 
    x = 5; 

for (var i=0; i<x; i++) { 
    arr.push(x); 
} 

console.log(arr); 
//=> [1, 2, 3, 5, 5, 5, 5, 5] 

Gibt es eine Möglichkeit, dies ohne Verwendung der for-Schleife zu tun?


aktualisieren

Obwohl Mover klug Lösungen gibt es, die for-Schleife

die performant zu sein scheint

array-fill-2Benchmarks on jsperf

Antwort

3

Sofern Sie nicht für jede Zeile bestraft von Code, den Sie schreiben, dieser Code ist in Ordnung: prägnant und sehr verständlich.

Wenn Sie tun bestraft, nur verwenden:

for (var i = 0; i < x; i++) arr.push(x); 

auf einer einzigen Zeile :-)

Darüber hinaus, Ihre beste Wette wäre eine Funktion entlang der Linien sein:

Aber ich glaube nicht, dass du da wirklich etwas gewinnst, da, wie erwähnt, es sehr wenig Probleme geben sollte, solch ein kleines l zu verstehen oo.

Alles in allem ist es wahrscheinlich eine Verschwendung von Zeit und Mühe zu versuchen, zu verbessern, was Sie derzeit haben.

+0

+1 für pragmatisch. Es ist leicht, sich in sinnlose Optimierungen einwickeln zu lassen. – naomik

+0

Ich habe meine ursprüngliche Frage um Benchmarks ergänzt – naomik

4

Ohne für Schleife:

var arr = [1,2,3], x = 5; 
arr = arr.concat(Array.apply(null, Array(x)).map(function() { return x; })); 

// or even 
arr = arr.concat(Array.apply(null, Array(x)).map(x.valueOf, x)); 
+2

OMG! Das ist wirklich alles, was ich dazu sagen kann :-) – paxdiablo

+0

razle blenden! das ist schick, aber ich denke, es leidet stark in der Leistung ... – naomik

+0

Ich denke '.map (x.valueOf, x)' könnte sogar eine leichte Verbesserung hier sein – naomik

1

Für diejenigen ES6 verwenden und über dieses Problem kommen. Verwenden Sie Array.fill() https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/fill

Ich verwendete diese Methode beim Testen, um Mock-Daten für X-Zeilen ohne Schleife zu generieren.

Edit: Sorry, ich war auf diesem einen. Dieser Code generiert ein Array x long, aber alle haben denselben Wert. Ein besseres Code-Snippet befindet sich am Ende dieses Posts.

newOrdersX: function(x) { 
    return Array(x).fill({ 
    name: faker.random.name() 
    }); 
}` 

Dieser wird ein Array x Ebenen lang sein, aber jeder Wert wird anders sein. Beachten Sie, dass immer noch aufgerufen werden muss oder nicht funktioniert.

newOrdersX: function(x) { 
    return Array(x).fill().map(() => ({ 
    name: faker.random.name() 
    })); 
}`