2012-05-04 41 views
18

Cách hiệu quả nhất để tạo mảng đơn giản này là gì.javascript - Tạo mảng động đơn giản

var arr = [ "1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]; 

Hãy nói rằng chúng tôi có thể nhận được số 10 từ một biến

var mynumber = 10; 
+0

Tail đệ quy sẽ fancier. – joshp

+0

@ joshp tốt, ông đã nói "hiệu quả nhất" vì vậy tôi sẽ đi với một for-loop: P –

+3

bạn có thực sự muốn những con số được lưu trữ như là chuỗi? – BiAiB

Trả lời

41
var arr = []; 
for(var i=1; i<=mynumber; i++) { 
    arr.push(i.toString()); 
} 
+0

nó không phải là rất khỏe mạnh để mở rộng mảng trên mỗi vòng lặp, điều này là gần như không thể tránh khỏi là hầu hết thời gian, nhưng lần này chúng ta biết chiều dài. (xem ans của tôi để biết thêm thông tin) – ajax333221

4

Âm thanh như bạn chỉ muốn xây dựng một mảng chứa các phiên bản chuỗi các giá trị số nguyên. Một cách tiếp cận đơn giản:

var arr = []; 
for (var i = 1; i <= mynumber; i++) arr.push(""+i); 

Đối với một phiên bản thú vị hơn bạn có thể làm một máy phát điện ...

function tail(i, maxval) { 
    return [i].concat(i < maxval ? tail(i+1, maxval) : []); 
} 

var arr = tail(1, mynumber); 
+0

Nó sẽ nhanh hơn nếu mynumber là địa phương bên trong các chức năng đuôi. –

+0

True - mặc dù tôi đã suy nghĩ tại một thời điểm về phạm vi python (START, STOP, STRIDE) chức năng. – koblas

2
var arr = []; 
while(mynumber--) { 
    arr[mynumber] = String(mynumber+1); 
} 
+0

Đây là suy nghĩ đầu tiên của tôi. Hiệu quả và súc tích. –

+0

Có thể nhanh hơn để tham gia/phân tách lại mảng số nguyên trong các ví dụ này để chuyển đổi một số cùng một lúc. ví dụ. sau các vòng lặp: 'arr = arr.join ('_'). split ('_');' và loại bỏ các bước 'String ()'. –

0

Nếu bạn đang tự hỏi liệu có một xây dựng trong Pythonic range - như chức năng, không có. Bạn phải làm điều đó theo cách bạo lực. Có thể rangy sẽ khiến bạn quan tâm.

1

đọc sai câu hỏi, đã sửa. Hãy thử:

var myNumber = 100, 
    myarr = (function arr(i){return i ? arr(i-1).concat(i) : [i]}(myNumber)); 

Chỉ cần cho vui, nếu bạn mở rộng Array như thế này:

Array.prototype.mapx = function(callback){ 
    return String(this).split(',').map(callback); 
} 

Bạn có thể sử dụng:

var myNum = 100, 
    myarr = new Array(myNum).mapx(function(el,i){return i+1;}); 
+1

ok, bây giờ tôi thay đổi 'mynumber = 100;' .. Xin vui lòng viết chuỗi dài cho tôi. –

+0

Xem chỉnh sửa của tôi. Nó không phải là hiệu quả trong điều khoản của chu kỳ CPU tôi giả sử, nhưng nó ngắn. – KooiInc

+0

+1 từ tôi cho máy phát điện lạnh. –

-2

Giống như cách bạn sẽ cho tất cả các mảng bạn muốn điền tự động. Vòng lặp for. Suedo code đang

arr =array() 
for(i; i<max; i++){ 
arr[]=i 

} 

rằng sẽ giúp bạn trên con đường

+1

sử dụng 'var i' để tránh globals, sử dụng' new Array() 'hoặc thậm chí tốt hơn' [] 'thay vì' array() ', cho' i' một giá trị bắt đầu, chỉ định một chỉ mục ở đây 'arr [] =. ..', làm cho các chuỗi giá trị, phạm vi không đúng (bạn cần sử dụng '<=' hoặc điều chỉnh phạm vi bằng cách thêm +1 hoặc cái gì đó) – ajax333221

0
var arr = []; 
for(var i=1; i<=mynumber; i++) { 
    arr.push("" + i); 
} 

này có vẻ là nhanh hơn trong Chrome, theo JSPerf, nhưng xin lưu ý rằng đó là tất cả rất duyệt phụ thuộc.

Có 4 điều bạn có thể thay đổi về đoạn này:

  1. Sử dụng for hoặc while.
  2. Sử dụng vòng lặp tiến hoặc lùi (với việc tạo mảng thưa thớt khi bắt đầu)
  3. Sử dụng push hoặc truy cập trực tiếp theo chỉ mục.
  4. Sử dụng xâu chuỗi ngầm hoặc gọi rõ ràng toString.

Trong mỗi và mọi tốc độ trình duyệt sẽ là kết hợp của mỗi tùy chọn tốt hơn cho mỗi mục trong danh sách này hoạt động trong trình duyệt cụ thể đó.

TL; DR: có lẽ không hay khi cố gắng tối ưu hóa vi mô phần cụ thể này.

+0

tại sao liều biến tôi bắt đầu bằng 1 chứ không phải 0? –

+0

@JinnySong, bạn đã đọc câu hỏi chưa? Nó cho thấy mảng bắt đầu bằng '" 1 "'. –

8

Dưới đây là làm thế nào tôi sẽ làm điều đó:

var mynumber = 10; 
var arr = new Array(mynumber); 

for (var i = 0; i < mynumber; i++) { 
    arr[i] = (i + 1).toString(); 
} 

câu trả lời của tôi là khá nhiều giống của tất cả mọi người, nhưng lưu ý rằng tôi đã làm một cái gì đó khác nhau:

  • Sẽ tốt hơn nếu bạn chỉ định chiều dài mảng và không buộc nó mở rộng mỗi lần

Vì vậy, tôi đã tạo mảng với new Array(mynumber);

3

Với ES2015, điều này có thể đạt được chính xác trong một biểu thức đơn bằng cách sử dụng phương pháp Array.from như vậy:

Array.from({ length: 10 }, (_, idx) => `${++idx}`) 

Đối số đầu tiên để from là một mảng như đối tượng đó cung cấp một thuộc tính length. Đối số thứ hai là một hàm bản đồ cho phép chúng ta thay thế các giá trị mặc định undefined bằng các giá trị chỉ mục đã điều chỉnh của chúng như bạn đã yêu cầu. Hãy kiểm tra đặc điểm kỹ thuật here

+0

một điều cần đề cập: bạn có thể sử dụng bất kỳ tên biến nào thay vì '_', thuộc tính đầu tiên của hàm bản đồ đại diện cho giá trị hiện tại của phần tử Mảng (arr [idx]). trong ví dụ này, luôn luôn là 'không xác định' – Lusk116

2

Tôi sẽ làm như sau;

var num = 10, 
 
    dynar = [...Array(num)].map((_,i) => ++i+""); 
 
console.log(dynar);

0
Array.apply(null, new Array(10)).map((el, i) => ++i + "") 
+4

Mặc dù đoạn mã này có thể giải quyết được câu hỏi, [bao gồm cả giải thích] (// meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers) thực sự hữu ích cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.Ngoài ra, vui lòng không cố gắng gắn mã của bạn với các nhận xét giải thích, điều này làm giảm khả năng đọc của cả mã và giải thích! –

Các vấn đề liên quan