ජාවාස්ක්‍රිප්ට් හි ද්විමාන අරාවක් නිර්මාණය කරන්නේ කෙසේද?


1151

මම මාර්ගගතව කියවා ඇති අතර සමහර ස්ථාන පවසන්නේ එය කළ නොහැකි බවයි, සමහරු එය එසේ යැයි පවසමින් පසුව උදාහරණයක් ලබා දෙන අතර තවත් සමහරු ආදර්ශය ප්‍රතික්ෂේප කරති.

  1. ජාවාස්ක්‍රිප්ට් හි ද්විමාන අරාවක් ප්‍රකාශ කරන්නේ කෙසේද? (එය කළ හැකි යැයි උපකල්පනය කරමින්)

  2. මම එහි සාමාජිකයින්ට ප්‍රවේශ වන්නේ කෙසේද? ( myArray[0][1]හෝ myArray[0,1]?)


21
තරමක් ව්‍යාකූල අර්ථ දැක්වීමක් උපකල්පනය කරමින්, ජාවාස්ක්‍රිප්ට් හි 2d අරා නිර්මාණය කිරීම තාක්‍ෂණිකව කළ නොහැකි ය. නමුත් ඔබට අරා සමූහයක් සෑදිය හැකිය, එය සමාන වේ.
අයි.ජේ කෙනඩි

10
FYI ... ඔබ වැඩි අරා භාවිතා කරමින් අරාවක් පුරවන විට, අරාව var arr2D = new Array(5).fill(new Array(3));(5) හි සෑම අංගයක්ම එකම අරාව (3) වෙත යොමු වේ. එබැවින් උප අරා ගතිකව ජනගහනය කිරීම සඳහා for loop භාවිතා කිරීම වඩාත් සුදුසුය.
ජොෂ් ස්ට්‍රිබ්ලිං

52
a = Array(5).fill(0).map(x => Array(10).fill(0))
Longfei Wu

2
වෙනත් වචන වලින් කිවහොත්, අරාවෙහි එක් එක් දර්ශකය පුරවා ඇති ලෙස fillඉල්ලා නොසිටින්න new Array(3), මන්ද එය ලැම්බඩා ප්‍රකාශනයක් හෝ කිසිවක් නොවේ, ඉහත සඳහන් කළ ලෝන්ග්ෆී වුගේ ප්‍රකාශය, මුලින් අරාව 0 ගේ පුරවන, පසුව සිතියම් ශ්‍රිතය ලැම්බඩා සමඟ භාවිතා කරයි සෑම අංගයක්ම නව අරාවකින් පුරවන්න. පිරවුම් ශ්‍රිතය හුදෙක් ඔබ පවසන දෙයින් අරාව පුරවයි. එය අර්ථවත්ද? මත වැඩි තොරතුරු සඳහා mapවන උත්සවයක්, බලන්න: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
ජොශ් Stribling

2
alekalehmann එය හොඳයි: meta.stackoverflow.com/a/252017/2311074 If the new question is a better question or has better answers, then vote to close the old one as a duplicate of the new one.
ඇඩම්

Answers:


1248

var items = [
  [1, 2],
  [3, 4],
  [5, 6]
];
console.log(items[0][0]); // 1
console.log(items[0][1]); // 2
console.log(items[1][0]); // 3
console.log(items[1][1]); // 4
console.log(items);


32
මේ ආකාරයට විශාල බහුමාන අරාවක් ආරම්භ කිරීම දුෂ්කර වනු ඇත. කෙසේ වෙතත්, පරාමිතීන් ලෙස දක්වා ඇති මානයන් සමඟ හිස් බහුමානයක් නිර්මාණය කිරීමට මෙම ශ්‍රිතය භාවිතා කළ හැකිය.
ඇන්ඩර්සන් ග්‍රීන්

2
Nd ඇන්ඩර්සන් ග්‍රීන් ඔබ බහු-ඩී අරාව විසඳුම ගැන උනන්දුවක් දක්වන අය සඳහා සබැඳියක් සඳහන් කිරීම හොඳ දෙයකි, නමුත් ප්‍රශ්නය සහ බෝල්සැසියන් 1 ගේ පිළිතුර “2D” අරාව ගැන මිස “බහු-ඩී” අරාව ගැන නොවේ
badReiko

ඔබ සියල්ලම හරහා යා යුතුයි ... උදා: ඇඟවීම් (අයිතම [0] [1]); // 2 යනාදිය
ඩොයිස්

1
@ සෂිකාඑක්ස්පී, මෙය 0 හැර වෙනත් පළමු දර්ශක සඳහා ක්‍රියා නොකරයි.
මයිකල් ෆ්‍රාන්ස්ල්

1
ප්‍රශ්නය වන්නේ ද්විමාන අරාවක් ප්‍රකාශ කරන්නේ කෙසේද යන්නයි. ප්‍රකාශ කිරීම සහ ආරම්භ කිරීම අතර වෙනස වටහා ගැනීමට අපොහොසත් වන මෙම සහ පහත දැක්වෙන පිළිතුරු මා සොයමින් සිටි දෙයයි. දන්නා දිගකින් හෝ අසීමිත ලෙස ප්‍රකාශයක් ද ඇත, ඒ කිසිවක් සාකච්ඡා නොකෙරේ.
chris

449

ඔබ හුදෙක් අරාව තුළ ඇති සෑම අයිතමයක්ම අරාවක් බවට පත් කරයි.

var x = new Array(10);

for (var i = 0; i < x.length; i++) {
  x[i] = new Array(3);
}

console.log(x);


6
ඔවුන්ගේ යතුරු සහ අගයන් සඳහා නූල් වැනි දෑ භාවිතා කළ හැකිද? myArray ['Book'] ['item1']?
ඩියාගෝ

42
Ie ඩියෙගෝ, ඔව්, නමුත් අරා සඳහා අදහස් කරන්නේ එය නොවේ. ඔබේ යතුරු නූල් වන විට වස්තුවක් භාවිතා කිරීම වඩා හොඳය.
මැතිව් ක්‍රම්ලි

10
මම මේ උදාහරණ වැනි පිළිගත් පිළිතුර වඩා හොඳ මෙම ගතිකව ප්රමාණයේ පෙලගැස්මක් සඳහා ක්රියාත්මක කළ හැකි බැවින්, උදා: new Array(size)එහිදී sizeවිචල්ය වේ.
විචල්‍යවාදය

1
ක්‍රියා නොකරයි - පැවරුමේ දෝෂයකි. මෙම පිළිතුර නිෂ් less ල නම් 280 ක් ලැබුනේ කෙසේද?
ගාර්ගෝ

1
මෙය ක්‍රියාත්මක වේ, ස්තූතියි. ඔබට උදාහරණයක් ලෙස Gargo jsfiddle.net/matasoy/oetw73sj
matasoy

203

සක්‍රිය කිරීමේ පිළිතුරට සමානව, n- මාන අරාවක් නිර්මාණය කිරීමේ ශ්‍රිතයක් මෙන්න:

function createArray(length) {
    var arr = new Array(length || 0),
        i = length;

    if (arguments.length > 1) {
        var args = Array.prototype.slice.call(arguments, 1);
        while(i--) arr[length-1 - i] = createArray.apply(this, args);
    }

    return arr;
}

createArray();     // [] or new Array()

createArray(2);    // new Array(2)

createArray(3, 2); // [new Array(2),
                   //  new Array(2),
                   //  new Array(2)]

2
මෙය 4 මාන අරාවක් නිර්මාණය කළ හැකිද?
trusktr

4
ustrusktr: ඔව්, ඔබට අවශ්‍ය තරම් මානයන් නිර්මාණය කළ හැකිය (ඔබේ මතක සීමාවන් තුළ). මානයන් හතරේ දිගින් ගමන් කරන්න. උදාහරණයක් ලෙස , var array = createArray(2, 3, 4, 5);.
මැතිව් ක්‍රම්ලි

4
හොඳම පිළිතුර! කෙසේ වෙතත්, එය පරාමිති 0 හෝ 1 සමඟ භාවිතා කිරීමට මම නිර්දේශ නොකරමි (
නිෂ් less ල

2
Rit බ්‍රිතාන්‍ය සංවර්ධනකරු ඔව්. මෙය 5D අරාවකි, එක් එක් දිග 5:[[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]],[[[[null,null],[null,null]],[[null,null],[null,null]]],[[[null,null],[null,null]],[[null,null],[null,null]]]]]
හයිකාම්

2
ඔබේ කාලය නාස්ති කිරීම ගැන කණගාටුයි - මම
උපහාසයට ලක්ව සිටියෙමි

84

ජාවාස්ක්‍රිප්ට් සතුව ඇත්තේ 1-මාන අරා පමණි, නමුත් අනෙක් අය පෙන්වා දුන් පරිදි ඔබට අරා අරා සෑදිය හැකිය.

ස්ථාවර මානයන්හි 2-d පෙළක් තැනීම සඳහා පහත ශ්‍රිතය භාවිතා කළ හැකිය:

function Create2DArray(rows) {
  var arr = [];

  for (var i=0;i<rows;i++) {
     arr[i] = [];
  }

  return arr;
}

තීරු ගණන සැබවින්ම වැදගත් නොවේ, මන්ද එය භාවිතා කිරීමට පෙර අරාවක ප්‍රමාණය නියම කිරීම අවශ්‍ය නොවේ.

එවිට ඔබට ඇමතිය හැකිය:

var arr = Create2DArray(100);

arr[50][2] = 5;
arr[70][5] = 7454;
// ...

කාඩ්පත් තට්ටුවක් නියෝජනය කරන අඳුරු 2 ක අරාවක් සෑදීමට මට අවශ්‍යය. එය කාඩ්පත් අගය රඳවා තබා පසුව ඇඳුම සහිත ද්වි-අඳුරු අරාවක් වනු ඇත. එය කිරීමට පහසුම ක්‍රමය කුමක්ද?
ඩග් හෝෆ්

1
Create2DArray (පේළි) ශ්‍රිතය {var arr = []; සඳහා (var i = 0; i <rows; i ++) {arr [i] = []; } ආපසු පැමිණීම; (ශ්‍රිත මුද්‍රණය (තට්ටුව) {සඳහා (t = 1; t <= 4; t ++) {සඳහා (i = 1; i <= 13; i ++) {document.writeln (තට්ටුව [t] [i]); t}} fucntion fillDeck (d) {සඳහා (t = 1; t <= 4; t ++) {myCardDeck [t] [1] = t; සඳහා (i = 1; i <= 13; i ++) {myCardDeck [t] [i] = i; load}} ශ්‍රිතය loadCardDeck () {var myCardDeck = Create2DArray (13); fillDeck (myCardDeck); මුද්‍රණය (myCardDeck); }
ඩග් හෝෆ්

2
Og ඩග්: ඔබට ඇත්ත වශයෙන්ම අවශ්‍ය වන්නේ ගුණාංග 2 ක් සහිත ඒක මාන වස්තු සමූහයකි. var තට්ටුව = []; තට්ටුව [0] = {මුහුණ: 1, ඇඳුම: 'එච්'};
ටීසිං ඩාර්ට්

Og ඩග්හෝෆ් එය අවම 2D- අරාව ?? : පී: ඩී
මහී

80

හිස් ද්විමාන අරාවක් (එක් පේළියක්) නිර්මාණය කරන්නේ කෙසේද

Array.from(Array(2), () => new Array(4))

2 සහ 4 පිළිවෙලින් පළමු හා දෙවන මානයන් වේ.

අපි භාවිතා කරමින් සිටිමු Array.from, එමඟින් අරාව වැනි පරාමිතියක් සහ එක් එක් මූලද්‍රව්‍ය සඳහා විකල්ප සිතියම් ගත කළ හැකිය.

Array.from (arrayLike [, mapFn [, thisArg]])

var arr = Array.from(Array(2), () => new Array(4));
arr[0][0] = 'foo';
console.info(arr);

1 ... N අඩංගු ජාවාස්ක්‍රිප්ට් අරාවක් සෑදීමට එකම උපක්‍රමය භාවිතා කළ හැකිය


විකල්පයක් ලෙස (නමුත් වඩා අකාර්යක්ෂම 12% සමඟ n = 10,000)

Array(2).fill(null).map(() => Array(4))

කාර්ය සාධනය අඩුවීම අපට ක්‍රියාත්මක වීමට පළමු මානයන් අගයන් තිබිය .mapයුතුය. Arrayඔබ එය ඇණවුම් කරන තෙක් .fillහෝ සෘජු අගය පැවරීම තෙක් තනතුරු වෙන් නොකරන බව මතක තබා ගන්න .

var arr = Array(2).fill(null).map(() => Array(4));
arr[0][0] = 'foo';
console.info(arr);


පසු විපරම

මෙන්න නිවැරදි යැයි පෙනෙන නමුත් ගැටළු ඇති ක්‍රමයක් .

 Array(2).fill(Array(4)); // BAD! Rows are copied by reference

පෙනෙන ආකාරයට අපේක්ෂිත ද්විමාන අරාව ( [ [ <4 empty items> ], [ <4 empty items> ] ]) ආපසු ලබා දෙන අතර, අල්ලා ගැනීමක් ඇත: පළමු මානයන් අරා යොමු කර පිටපත් කර ඇත. ඒ කියන්නේ arr[0][0] = 'foo'ඇත්ත වශයෙන්ම එකක් වෙනුවට පේළි දෙකක් වෙනස් කරයි.

var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo';
console.info(arr);
console.info(arr[0][0], arr[1][0]);


මම මෙය යෝජනා කරමි:Array.from({length:5}, () => [])
vsync

මෙහි ආත්මීය නමුත් මෙම පිළිතුර (එය තුළ පළමු හා දෙවන) සාරාංශගත, වේගවත් හා නවීනතම හොඳම ශේෂය සේ පෙනේ.
බ්‍රැඩි ඩව්ලිං

urzurfyx කිසියම් අදහසක් හෝ කිසිවෙකු දන්නවාද, වෙබ් කුණාටුව මේ ගැන පැමිණිලි කරන්නේ ඇයි? එය අරාව ලෙස පෙනේ. අගයන් නිර්වචනය කර නැති ලෙස තබා ඇති අතර පසුව නිර්මාණය කරන ලද අරාව සමඟ මට වැඩ කළ නොහැක, මෙහි ස්නිපටය ස්ටැක් ඕවර් ප්‍රවාහයේ හොඳින් ක්‍රියාත්මක වුවද
FaultyJuggler

77

පහසුම ක්‍රමය:

var myArray = [[]];

30
එය ද්විමාන අරාවකි
මෞරිසියෝ ඩෙන්මාර්කයේ

15
ඔව්, ඒ ගැන සැලකිලිමත් වන්න. MyArray [0] [ඕනෑම දෙයක්] පැවරීම හොඳයි, නමුත් උත්සාහ කර myArray [1] [ඕනෑම දෙයක්] සකසන්න, එවිට MyArray [1] නිර්වචනය කර නොමැති බවට පැමිණිලි කරයි.
පිලිප්

23
Il ෆිලිප් ඔබ myArray[1]=[];පැවරීමට පෙර සැකසිය යුතුයmyArray[1][0]=5;
182764125216

4
මෙම වන්නේ, දැනුවත් විය නොහැකි @AndersonGreen ලියූ පරිදි "හිස් 1x1 අරාවක් නිර්මාණය". එය "1x0" අරාවක් නිර්මාණය කරයි (එනම් තීරු 0 ක් සහිත අරාවක් අඩංගු 1 පේළිය). myArray.length == 1සහ myArray[0].length == 0. ඔබ "අව්‍යාජ හිස්" "0x0" අරාවක් එයට පිටපත් කළහොත් එය වැරදි ප්‍රති result ල ලබා දෙයි.
ජෝන් බ්රේව්

4
27 182764125216 එය මට දවසේ දැනුම විය . ස්තූතියි :)
th3pirat3

47

සමහරු එය කළ නොහැකි යැයි පැවසීමට හේතුව ද්විමාන අරාව සැබවින්ම අරා සමූහයක් වීමයි. මෙහි ඇති අනෙක් අදහස් ජාවාස්ක්‍රිප්ට් හි ද්විමාන අරා නිර්මාණය කිරීම සඳහා පරිපූර්ණ වලංගු ක්‍රමවේදයන් සපයයි, නමුත් පිරිසිදු දෘෂ්ටි කෝණය නම් ඔබට එක් මානයන්හි වස්තු සමූහයක් තිබීමයි, එම සෑම වස්තුවක්ම මූලද්‍රව්‍ය දෙකකින් සමන්විත ඒක මාන අරාවක් වනු ඇත.

ඉතින්, ගැටුම්කාරී දෘෂ්ටි කෝණයන් සඳහා හේතුව එයයි.


42
නැහැ, එය එසේ නොවේ. සමහර භාෂාවලින්, ඔබට වැනි බහුමානීය අරා තිබිය හැකිය string[3,5] = "foo";. Y අක්ෂය ඇත්ත වශයෙන්ම X අක්ෂයේ දරුවෙකු නොවන නිසා සමහර අවස්ථා සඳහා එය වඩා හොඳ ප්‍රවේශයකි.
රෆායෙල් සෝරස්

3
එය යටි යන්ත කේතයට ලඟා වූ පසු, මානය> 1 හි සියලු ආතතීන් අරා වල අරා වේ, අප කතා කරන භාෂාව කුමක් වුවත්. හැඹිලි ප්‍රශස්තිකරණය සඳහා හේතු මත මෙය මතකයේ තබා ගැනීම වටී. සංඛ්‍යාත්මක පරිගණනය සඳහා බැරෑරුම් ලෙස සපුරාලන ඕනෑම යහපත් භාෂාවක් මඟින් ඔබේ බහු-මාන ව්‍යුහය මතකයේ පෙළගැස්වීමට ඉඩ සලසයි, එමඟින් ඔබ වැඩිපුරම භාවිතා කරන මානය එකවර ගබඩා කර ඇත. පයිතන්ගේ නැම්පි, ෆෝට්රාන් සහ සී මතකයට එයි. ඇත්ත වශයෙන්ම මෙම හේතුව නිසා විවිධ ව්‍යුහයන් වෙත මානයන් අඩු කිරීම වටී.
තෝමස් බ්‍රවුන්

පරිගණකවලට මානයන් පිළිබඳ අදහසක් නොමැත. ඇත්තේ 1 මානයකි, මතක ලිපිනය. අනෙක් සියල්ලම ක්‍රමලේඛකයාගේ ප්‍රයෝජනය සඳහා අංකිත සැරසිලි වේ.
ටීසිං ඩාර්ට්

3
H තෝමස් බ්‍රවුන් හරියටම නොවේ. "අරා අරා" සඳහා අභ්‍යන්තර අරා වල ප්‍රමාණයන් සඳහා යම් ගබඩා කිරීමක් අවශ්‍ය වේ (ඒවා වෙනස් විය හැකිය) සහ අභ්‍යන්තර අරාව ගබඩා කර ඇති ස්ථානය සොයා ගැනීමට තවත් දර්ශකයක් අවලංගු කරයි. ඕනෑම "යහපත්" භාෂාවක බහුවිධ අරා හකුරු අරා වලට වඩා වෙනස් වේ, මන්ද ඒවා එකිනෙකට වෙනස් දත්ත ව්‍යුහයන් වේ. (ව්‍යාකූල කොටස නම්, සී අරා [අ] [ආ] සින්ටැක්ස් සමඟ සුචිගත කර තිබුණද ඒවා
බහුකාර්ය

34

තල්ලු කිරීමේ භාවිතය ස්වල්ප දෙනෙක් පෙන්වයි:
අළුත් දෙයක් ගෙන ඒමට, යම් අගයකින් අනුකෘතිය ආරම්භ කරන්නේ කෙසේදැයි මම ඔබට පෙන්වන්නම්, උදාහරණ: 0 හෝ හිස් නූලක් "".
ඔබට මූලද්‍රව්‍ය 10 ක අරාවක් තිබේ නම්, ජාවාස්ක්‍රිප්ට් හි අවසාන දර්ශකය 9 ක් වනු ඇති බව මතක් කිරීම!

function matrix( rows, cols, defaultValue){

  var arr = [];

  // Creates all lines:
  for(var i=0; i < rows; i++){

      // Creates an empty line
      arr.push([]);

      // Adds cols to the empty line:
      arr[i].push( new Array(cols));

      for(var j=0; j < cols; j++){
        // Initializes:
        arr[i][j] = defaultValue;
      }
  }

return arr;
}

භාවිත උදාහරණ:

x = matrix( 2 , 3,''); // 2 lines, 3 cols filled with empty string
y = matrix( 10, 5, 0);// 10 lines, 5 cols filled with 0

මම forඔබේ ක්‍රියාපටිපාටියෙන් අවසන් (පෙරනිමි අගය සකසන) ඉවත් කර ලියමි m=matrix(3,4); m[1][2]=2; console.log(JSON.stringify(m));- තවද අපට ඉතා තදබල අනුකෘතියක් (ඕනෑවට වඩා කැදැලි) ලැබේ - ඔබ එය පෙරනිමිය සඳහා අවසාන පියවරේදී අළුත්වැඩියා කරයි, නමුත් මීට පෙර අඩු කැදැලි අරා භාවිතා කිරීමට ඔබට ක්‍රියා පටිපාටිය නැවත ලිවිය හැකිය. පෙරනිමි අගයන් සැකසීම.
Kamil Kiełczewski

27

ද්වි-ලයිනර්:

var a = []; 
while(a.push([]) < 10);

එය අරා වලින් පුරවා ඇති දිග 10 ක අරාවක් ජනනය කරනු ඇත. (තල්ලු කිරීම අරාවකට මූලද්‍රව්‍යයක් එකතු කර නව දිග ලබා දෙයි)


13
එක් ලයිනර් : for (var a=[]; a.push([])<10;);?
බර්ගි

Erbergi ඊලඟ පේළියේ විචල්‍යය තවමත් අර්ථ දක්වනු ඇත්ද ..?
StinkyCat

1
@ ස්ටින්කි කැට්: ඔව්, එය ක්‍රියාත්මක වන්නේ එලෙසයි var. එය සැමවිටම ක්‍රියාකාරී-විෂය පථයකි.
බර්ගි

මම දනිමි, එබැවින් මෙම අවස්ථාවේදී ඔබේ එක් ලයිනර්
නිෂ් less ල ය

1
domenukk සහ erBergi, ඔබ දෙදෙනාම නිවැරදිය. මම එය අත්හදා බැලූ අතර මට පසුව ප්‍රවේශ විය හැකිය. මම සමාව ඉල්ලනවා! ස්තූතියි, මෙය මට පාඩමක් වේවා;)
StinkyCat

24

වඩාත්ම සැනසිලිදායක පිළිතුර එයයි

var nrows = ~~(Math.random() * 10);
var ncols = ~~(Math.random() * 10);
console.log(`rows:${nrows}`);
console.log(`cols:${ncols}`);
var matrix = new Array(nrows).fill(0).map(row => new Array(ncols).fill(0));
console.log(matrix);


පිරවුම නොගැඹුරු පිටපත් සාදන්නෙකු භාවිතා කරන බැවින් අපට පේළි සමඟ කෙලින්ම පුරවා ගත නොහැකි බව සලකන්න , එබැවින් සියලු පේළි එකම මතකය බෙදා ගනී ... එක් එක් පේළිය බෙදාගන්නේ කෙසේද යන්න පෙන්වන උදාහරණය මෙන්න (වෙනත් පිළිතුරු වලින් ගත්):

// DON'T do this: each row in arr, is shared
var arr = Array(2).fill(Array(4));
arr[0][0] = 'foo'; // also modifies arr[1][0]
console.info(arr);

මෙය ඉහළින්ම තිබිය යුතුය. මම ඒ හා සමාන දෙයක් භාවිතා කළ Array.apply(null, Array(nrows))නමුත් මෙය වඩාත් අලංකාරයි.
dimiguel

මෙය මගේ අවසාන අදහස් දැක්වීමයි ... ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් සහ ඔපෙරා සඳහා සහය නොමැත fill. මෙය බ්‍රව්සර් බහුතරයක ක්‍රියා නොකරනු ඇත.
ඩිමිගුවෙල්

imdimgl Fill මෙම අවස්ථාවෙහිදී නියත සිතියමක් සමඟ අනුකරණය කළ හැකිය:, Array(nrows).map(() => 0)හෝ,Array(nrows).map(function(){ return 0; });
Conor O'Brien

20

පහසුම ක්‍රමය:

var arr  = [];

var arr1 = ['00','01'];
var arr2 = ['10','11'];
var arr3 = ['20','21'];

arr.push(arr1);
arr.push(arr2);
arr.push(arr3);

alert(arr[0][1]); // '01'
alert(arr[1][1]); // '11'
alert(arr[2][0]); // '20'

18

මා අත්කරගත්තේ මෙයයි:

var appVar = [[]];
appVar[0][4] = "bineesh";
appVar[0][5] = "kumar";
console.log(appVar[0][4] + appVar[0][5]);
console.log(appVar);

මේ නිසා මට බයිනෙෂ්කුමාර් අක්ෂර වින්‍යාසය ලැබුණා


2
මව් අරාවේ 0 දර්ශකයට පමණක් ඔබට ප්‍රවේශ විය හැකි ආකාරය සැලකිල්ලට ගන්න. මෙය ඔබට සැකසීමට ඉඩ දෙන දෙයක් තරම් ප්‍රයෝජනවත් නොවේ, උදාහරණයක් ලෙස appVar [5] [9] = 10; ... ඔබට '9' නිර්වචනය නොකළ දේපල සැකසීමට නොහැකි වනු ඇත.
RaisinBranCrunch

නමුත් appVar[1][4] = "bineesh";වැරදියි, එය විසඳන්නේ කෙසේද?
ගන්ක්

16

තනි මාන මාන අරා ඇති ආකාරයටම ද්විමාන අරා නිර්මාණය වේ. ඔබ ඒවාට ප්‍රවේශ වන්න array[0][1].

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

alert (arr[2][1]); //alerts "4"

14

කවුරුහරි මෙයට පිළිතුරු දී ඇත්දැයි මට විශ්වාස නැත, නමුත් මෙය මට හොඳින් වැඩ කළ බව මට පෙනී ගියේය -

var array = [[,],[,]]

උදා:

var a = [[1,2],[3,4]]

උදාහරණයක් ලෙස ද්විමාන අරාවක් සඳහා.


මම මෙය ගතිකව කරන්නේ කෙසේද? මට විවිධ ප්‍රමාණවලින් අභ්‍යන්තර අරා අවශ්‍යයි.
alap

3
ඔබට අමතර කොමාව var array = [[],[]]අවශ්‍ය නොවේ.
කායා ටෝස්ට්

14

සියලු දර්ශක ආමන්ත්‍රණය කළ හැකි හා අගයන් ශුන්‍ය ලෙස සකසා ඇති විරල නොවන "2D" අරාව (x, y) නිර්මාණය කිරීම සඳහා:

let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null))) 

ප්‍රසාද "3D" අරාව (x, y, z)

let 3Darray = new Array(x).fill(null).map(item=>(new Array(y).fill(null)).map(item=>Array(z).fill(null)))

මේ පිළිබඳ විචලනයන් සහ නිවැරදි කිරීම් අදහස් සහ විවිධ අවස්ථා වලදී මෙම ප්‍රශ්නයට ප්‍රතිචාර වශයෙන් සඳහන් කර ඇති නමුත් සත්‍ය පිළිතුරක් ලෙස නොව මම මෙහි මෙහි එක් කරමි.

(වෙනත් බොහෝ පිළිතුරු වලට සමාන) මෙය O (x * y) කාල සංකීර්ණතාවයක් ඇති බව සැලකිල්ලට ගත යුතුය, එබැවින් එය ඉතා විශාල අරා සඳහා සුදුසු නොවේ.


1
fillඑකම අගයක් සකසන බැවින් ප්‍රවේශම් වන්න . null`වස්තුව 'ලෙස වෙනස් වුවහොත් එය සෑම තීරුවකම එකම වස්තුවක් වනු ඇත
ස්ටැනිස්ලාව් මයෝරොව්

@StanislavMayorov ඔබට සෑම සෛලයකම අගය සැකසීමට අවශ්‍ය නම්, එකම උපක්‍රමයම භාවිතා කරන්න:let 2Darray = new Array(x).fill(null).map(item =>(new Array(y).fill(null).map(cell =>(yourValueHere))))
haykam

13

ජාවාස්ක්‍රිප්ට් හි 2D අරා නිර්මාණය කිරීම සඳහා අපට පළමුව අරාව නිර්මාණය කළ හැකි අතර පසුව එහි මූලද්‍රව්‍ය ලෙස අරා එකතු කළ හැකිය. මෙම ක්‍රමය මඟින් ලබා දී ඇති පේළි සහ තීරු ගණන සමඟ 2D අරාවක් ලබා දෙනු ඇත.

function Create2DArray(rows,columns) {
   var x = new Array(rows);
   for (var i = 0; i < rows; i++) {
       x[i] = new Array(columns);
   }
   return x;
}

අරාව සෑදීමට පහත ක්‍රමය භාවිතා කරන්න.

var array = Create2DArray(10,20);

2
කරුණාකර ඔබ ඔබේ පිළිතුරු සපයන්නාට එය ක්‍රියාත්මක වන ආකාරය සහ එය ගැටළුව විසඳන්නේ ඇයිද යන්න පැහැදිලි කිරීමේ තොරතුරු කිහිපයක් එක් කරන්න. අනාගතයේදී මෙම පිටුව සොයා ගන්නා අනෙක් අයට මෙය උපකාරී වනු ඇත
කෙසෙල්හි අපගේ මිනිසා

ජාවාස්ක්‍රිප්ට් හි නිශ්චිත තීරු ගණනක් සමඟ පූර්වයෙන් සකස් කර ඇති අරාවක් ඔබට අවශ්‍ය වන්නේ කවදාද? ඔබට [] අරාවෙහි n-th මූලද්‍රව්‍යයටද පිවිසිය හැකිය.
domenukk

ශ්‍රිතය C ප්‍රාග්ධනයෙන් ආරම්භ වන බව මම දුටුවෙමි (සමහර සම්මුතීන් අනුව) එය ක්‍රියාකාරී ඉදිකිරීම්කරුවෙකු වනු ඇති අතර ඔබ එය නව මූල පදය සමඟ භාවිතා කරනු ඇත. ඉතා සුළු හා තරමක් මතයක් ඇති, නමුත් මම තවමත් යෝජනා කරන්නේ ප්‍රාග්ධනීකරණය නොකළ වචනයකි.
හචි

12

එක් ලයිනර් පෙම්වතුන් සඳහා Array.from ()

// creates 8x8 array filed with "0"    
const arr2d = Array.from({ length: 8 }, () => Array.from({ length: 8 }, () => "0"))

තවත් එකක් (dmitry_romanov අදහස් දැක්වීමෙන්) Array () භාවිතා කරන්න . පුරවන්න ()

// creates 8x8 array filed with "0"    
const arr2d = Array(8).fill(0).map(() => Array(8).fill("0"))

ES6 + පැතිරීමේ ක්‍රියාකරු භාවිතා කිරීම (InspiredJW පිළිතුරෙන් "දේවානුභාවයෙන්" :))

// same as above just a little shorter
const arr2d = [...Array(8)].map(() => Array(8).fill("0"))

2
0පළමු fill()const arr2d = Array(8).fill().map(() => Array(8).fill("0"));
ශ්‍රිතයෙන්

10

අරා අවබෝධය භාවිතා කරන්න

ජාවාස්ක්‍රිප්ට් 1.7 සහ ඊට වැඩි ද්විමාන අරා නිර්මාණය කිරීම සඳහා ඔබට අරාව අවබෝධය භාවිතා කළ හැකිය . අරාව පුරවන අතරතුර ඔබට ඇතුළත් කිරීම් පෙරීම සහ / හෝ හැසිරවිය හැකි අතර ලූප භාවිතා කිරීමට අවශ්‍ය නැත.

var rows = [1, 2, 3];
var cols = ["a", "b", "c", "d"];

var grid = [ for (r of rows) [ for (c of cols) r+c ] ];

/* 
         grid = [
            ["1a","1b","1c","1d"],
            ["2a","2b","2c","2d"],
            ["3a","3b","3c","3d"]
         ]
*/

ඔබට අවශ්‍ය ඕනෑම n x mඅරාවක් සාදා එය ඇමතීමෙන් පෙරනිමි අගයකින් පුරවා ගත හැකිය

var default = 0;  // your 2d array will be filled with this value
var n_dim = 2;
var m_dim = 7; 

var arr = [ for (n of Array(n_dim)) [ for (m of Array(m_dim) default ]] 
/* 
         arr = [
            [0, 0, 0, 0, 0, 0, 0],
            [0, 0, 0, 0, 0, 0, 0],
         ]
*/

තවත් උදාහරණ සහ ලේඛන මෙහි සොයාගත හැකිය .

මෙය තවමත් සම්මත අංගයක් නොවන බව කරුණාවෙන් සලකන්න .


ඉක්මන් ගූගල් පරීක්‍ෂණයක් මෙහි ... ඔව් ... forප්‍රකාශය තවමත්
ලූපයකි

1
එයට කිසිදු බ්‍රව්සරයක් සහාය නොදක්වයි - මෙතැන ?
Kamil Kiełczewski

9

කාර්ය සාධනය

අද 2020.02.05 තෝරාගත් විසඳුම් සඳහා මම මැක් ඕස් හයිසෙයිරා 10.13.6 ක්‍රෝම් v79.0, සෆාරි v13.0.4 සහ ෆයර්ෆොක්ස් v72.0 මත පරීක්ෂණ සිදු කරමි.

ආරම්භක නොවන 2d අරාව සඳහා නිගමන

  • එසෝටරික් ද්‍රාවණය {}/arr[[i,j]](එන්) විශාල හා කුඩා අරා සඳහා වේගවත් වන අතර එය විශාල විරල අරා සඳහා හොඳ තේරීමක් බව පෙනේ
  • for-[]/while(A, G) මත පදනම් වූ විසඳුම් වේගවත් වන අතර ඒවා කුඩා අරා සඳහා හොඳ තේරීමක් වේ.
  • විසඳුම් for-[](බී, සී) වේගවත් වන අතර ඒවා විශාල අරා සඳහා හොඳ තේරීමක් වේ
  • Array..map/from/fill(I, J, K, L, M) මත පදනම් වූ විසඳුම් කුඩා අරා සඳහා තරමක් මන්දගාමී වන අතර විශාල අරා සඳහා තරමක් වේගවත් වේ
  • surprinsingly for-Array(n)(B, C) ට වඩා සෆාරි මත බෙහෙවින් අඩු වේ for-[](A)
  • surprinsingly for-[]විශාල අරාව සඳහා වන (අ) සියලු බ්රව්සර් මත සෙමින්
  • විසඳුම් සියලු බ්‍රව්සර් සඳහා කුඩා අරා සඳහා මන්දගාමී වේ
  • A, E, G විසඳුම් සියලු බ්‍රව්සර් සඳහා විශාල අරා සඳහා මන්දගාමී වේ
  • විසඳුම M සියලු බ්‍රව්සර්වල ඇති සියලුම අරා සඳහා මන්දගාමී වේ

රූප විස්තරය මෙහි ඇතුළත් කරන්න

ආරම්භක 2d අරාව සඳහා නිගමන

  • for/while(A, B, C, D, E, G) මත පදනම් වූ විසඳුම් සියලු බ්‍රව්සර්වල කුඩා අරා සඳහා වේගවත් / වේගවත් වේ
  • for(A, B, C, E) මත පදනම් වූ විසඳුම් සියලු බ්‍රව්සර්වල විශාල අරා සඳහා වේගවත් / තරමක් වේගවත් වේ
  • Array..map/from/fill(I, J, K, L, M) මත පදනම් වූ විසඳුම් සියලු බ්‍රව්සර්වල කුඩා අරා සඳහා මධ්‍යම වේගවත් හෝ මන්දගාමී වේ
  • විශාල අරා සඳහා F, G, H, I, J, K, L විසඳුම් ක්‍රෝම් සහ සෆාරි මත මධ්‍යම හෝ වේගවත් නමුත් ෆයර්ෆොක්ස් මත මන්දගාමී වේ.
  • {}/arr[[i,j]]සියලුම බ්‍රව්සර්වල කුඩා හා විශාල අරා සඳහා එසෝටරික් ද්‍රාවණය (එන්) මන්දගාමී වේ

රූප විස්තරය මෙහි ඇතුළත් කරන්න

විස්තර

නිමැවුම් අරාව පුරවා නැති (ආරම්භක) විසඳුම් සඳහා පරීක්ෂණය

විසඳුම් සඳහා අපි වේගය පරීක්ෂා කරමු

  • කුඩා අරා (මූලද්‍රව්‍ය 12) - ඔබට ඔබේ යන්ත්‍රයේ පරීක්ෂණ සිදු කළ හැකිය මෙතැන
  • විශාල අරා (මූලද්‍රව්‍ය මිලියනය) අරා - ඔබට ඔබේ යන්ත්‍රය මත පරීක්ෂණ සිදු කළ හැකිය මෙතැන

නිමැවුම් අරාව පුරවන (ආරම්භක) විසඳුම් සඳහා පරීක්ෂණය

විසඳුම් සඳහා අපි වේගය පරීක්ෂා කරමු

  • කුඩා අරා (මූලද්‍රව්‍ය 12) - ඔබට ඔබේ යන්ත්‍රයේ පරීක්ෂණ සිදු කළ හැකිය මෙතැන
  • විශාල අරා (මූලද්‍රව්‍ය මිලියනය) අරා - ඔබට ඔබේ යන්ත්‍රය මත පරීක්ෂණ සිදු කළ හැකිය මෙතැන

රූප විස්තරය මෙහි ඇතුළත් කරන්න


8

මගේ ප්‍රවේශය ine බිනීෂ් පිළිතුරට බොහෝ සෙයින් සමාන නමුත් වඩාත් පොදු ප්‍රවේශයකින්.

ඔබට ද්විත්ව අරාව පහත පරිදි ප්‍රකාශ කළ හැකිය:

var myDoubleArray = [[]];

පහත සඳහන් ආකාරයට ගබඩා කිරීම සහ ප්‍රවේශ වීම:

var testArray1 = [9,8]
var testArray2 = [3,5,7,9,10]
var testArray3 = {"test":123}
var index = 0;

myDoubleArray[index++] = testArray1;
myDoubleArray[index++] = testArray2;
myDoubleArray[index++] = testArray3;

console.log(myDoubleArray[0],myDoubleArray[1][3], myDoubleArray[2]['test'],) 

මෙය අපේක්ෂිත ප්‍රතිදානය මුද්‍රණය කරනු ඇත

[ 9, 8 ] 9 123

7

පහත දැක්වෙන සරලම ක්‍රමය මම සොයා ගතිමි:

var array1 = [[]];   
array1[0][100] = 5; 

alert(array1[0][100]);
alert(array1.length);
alert(array1[0].length);

array1[1][100] = 666;විසි කිරීමUncaught TypeError: Cannot set property '100' of undefined
Kamil Kiełczewski

@ KamilKiełczewski ඔබ නිවැරදියි, මෙය පළමු අරාව සඳහා පමණක් ආරම්භ වන බවක් පෙනේ, දෙවනුව ඔබ එසේ කිරීමට පෙර array1[1][100] = 666;, ඔබ මෙය කළ array1[1] = [];යුතුය.
GMsoF

6

ජාවාස්ක්‍රිප්ට් ද්විමාන අරා සඳහා සහය නොදක්වයි, ඒ වෙනුවට අපි වෙනත් අරාවක් තුළ අරාවක් ගබඩා කර එම අරාවෙහි දත්ත ලබා ගන්නේ ඔබට ප්‍රවේශ වීමට අවශ්‍ය එම අරාවේ කුමන ස්ථානයටද යන්න මතය. අරාව සංඛ්‍යා ආරම්භ වන්නේ ZERO වලින් බව මතක තබා ගන්න .

කේත උදාහරණය:

/* Two dimensional array that's 5 x 5 

       C0 C1 C2 C3 C4 
    R0[1][1][1][1][1] 
    R1[1][1][1][1][1] 
    R2[1][1][1][1][1] 
    R3[1][1][1][1][1] 
    R4[1][1][1][1][1] 
*/

var row0 = [1,1,1,1,1],
    row1 = [1,1,1,1,1],
    row2 = [1,1,1,1,1],
    row3 = [1,1,1,1,1],
    row4 = [1,1,1,1,1];

var table = [row0,row1,row2,row3,row4];
console.log(table[0][0]); // Get the first item in the array

6

var playList = [
  ['I Did It My Way', 'Frank Sinatra'],
  ['Respect', 'Aretha Franklin'],
  ['Imagine', 'John Lennon'],
  ['Born to Run', 'Bruce Springsteen'],
  ['Louie Louie', 'The Kingsmen'],
  ['Maybellene', 'Chuck Berry']
];

function print(message) {
  document.write(message);
}

function printSongs( songs ) {
  var listHTML;
  listHTML = '<ol>';
  for ( var i = 0; i < songs.length; i += 1) {
    listHTML += '<li>' + songs[i][0] + ' by ' + songs[i][1] + '</li>';
  }
  listHTML += '</ol>';
  print(listHTML);
}

printSongs(playList);


6

ES6 +, ES2015 + ට මෙය වඩාත් සරල ආකාරයකින් කළ හැකිය


3 x 2 අරා නිර්මාණය කිරීම සත්‍යයෙන් පිරී ඇත

[...Array(3)].map(item => Array(2).fill(true))

මට පාපොච්චාරණය කරන්න ඕන. මම ඔබේ පිළිතුර "සම්මත" කර මගේ එක්-ලයිනර් එකතුවට එකතු කළෙමි .
my-

5

මට අවශ්‍ය පරිදි "වාර්තා" එක් කිරීමටත්, ඒවා යාවත්කාලීන කිරීමටත්, වැඩිදුර සැකසුම් සඳහා දත්ත සමුදායකට යැවීමට පෙර අවශ්‍ය ඕනෑම ගණනය කිරීම් කිරීමටත් මට නම්යශීලී අරා ශ්‍රිතයක් කිරීමට සිදු විය. මෙන්න කේතය, එය උපකාරී වේ යැයි සිතමු :).

function Add2List(clmn1, clmn2, clmn3) {
    aColumns.push(clmn1,clmn2,clmn3); // Creates array with "record"
    aLine.splice(aPos, 0,aColumns);  // Inserts new "record" at position aPos in main array
    aColumns = [];    // Resets temporary array
    aPos++ // Increments position not to overlap previous "records"
}

ඕනෑම දෝෂයක් ප්‍රශස්තිකරණය කිරීමට සහ / හෝ පෙන්වා දීමට නිදහස් වන්න :)


කොහොමද aLine.push([clmn1, clmn2, clmn3]);?
Pimp Trizkit

5

මෙන්න මම ද්විමාන අරාවක් සෑදීමට සොයාගත් ඉක්මන් ක්‍රමයක්.

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(e => Array(y));
}

ඔබට පහසුවෙන් මෙම ශ්‍රිතය ES5 ශ්‍රිතයක් බවට පත් කළ හැකිය.

function createArray(x, y) {
    return Array.apply(null, Array(x)).map(function(e) {
        return Array(y);
    });
}

මෙය ක්‍රියාත්මක වන්නේ ඇයි: new Array(n)ඉදිකිරීම්කරු විසින් මූලාකෘතියක් සහිත වස්තුවක් නිර්මාණය කරයිArray.prototype පසුව එම වස්තුව පවරයි length. එහි සැබෑ සාමාජිකයන් නොමැතිකම නිසා අපට Array.prototype.mapඑය ක්‍රියාත්මක කළ නොහැක.

කෙසේ වෙතත්, ඔබ ඉදිකිරීම්කරුට තර්ක එකකට වඩා ලබා දෙන විට, ඔබ එසේ කරන විට වැනි Array(1, 2, 3, 4), ඉදිකිරීම්කරු විසින් භාවිතා කරනු ඇතargumentsArray වස්තුව නිවැරදිව ක්ෂණිකව හා ජනගහනය කිරීමට .

මෙම හේතුව නිසා, අපට භාවිතා කළ හැකිය Array.apply(null, Array(x)), මන්ද applyශ්‍රිතය මඟින් ඉදිකිරීම්කරු වෙත තර්ක පැතිරෙනු ඇත. පැහැදිලි කිරීම සඳහා, කිරීමArray.apply(null, Array(3)) සමාන වේ Array(null, null, null).

දැන් අපි සත්‍ය ජනගහනයක් ඇති අරාවක් නිර්මාණය කර ඇති අතර, අප කළ යුත්තේ mapදෙවන ස්ථරය ( y) අමතා නිර්මාණය කිරීමයි .


5

එකකට පහළින්, 5x5 න්‍යාසයක් සාදා ඒවා පුරවන්න null

var md = [];
for(var i=0; i<5; i++) {
    md.push(new Array(5).fill(null));
}

console.log(md);


3
මෙම පිළිතුර වැරදිය. එමඟින් එහි කට්ටලවල එකම අරා පිරවීමක් සහිත අරාවක් නිර්මාණය වේ. md[1][0] = 3 අනෙක් සියලුම අංග යාවත්කාලීන වේ
Qiang

5

ධාවන වේලාවේ පමණක් දන්නා අරාවක පේළි සහ තීරු ප්‍රමාණයන් පසුව ගතික 2d අරාවක් නිර්මාණය කිරීම සඳහා පහත දැක්වෙන ක්‍රමය භාවිතා කළ හැකිය .

var num = '123456';
var row = 3; // Known at run time
var col = 2; // Known at run time
var i = 0;

var array2D = [[]];
for(var r = 0; r < row; ++r)
{
    array2D[r] = [];
    for(var c = 0; c < col; ++c)
    {
        array2D[r][c] = num[i++];
    }
}
console.log(array2D); 
// [[ '1', '2' ], 
//  [ '3', '4' ], 
//  [ '5', '6' ]]

console.log(array2D[2][1]); // 6


4

0 පුරවා ඇති am * n 2 මාන අරාව නිර්මාණය කිරීමට එක් ලයිනර්.

new Array(m).fill(new Array(n).fill(0));

3
ඇත්ත වශයෙන්ම, මෙය නිර්මාණය කරන්නේ අරා දෙකක් පමණි. දෙවන මානයන් සෑම දර්ශකයකම එකම අරාව වනු ඇත.
පිජුස්න්

6
ඔව්, මම ගොචා තහවුරු කරමි. ඉක්මන් විසඳුම : a = Array(m).fill(0).map(() => Array(n).fill(0))? mapයොමු කිරීම ලිහා, එක් තව් එකකට අද්විතීය අරාවක් නිර්මාණය කරයි.
dmitry_romanov
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.