අරා සමූහයක් ඒකාබද්ධ කරන්න / සමතලා කරන්න


1145

මට ජාවාස්ක්‍රිප්ට් අරාවක් ඇත:

[["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]]

වෙනම අභ්‍යන්තර අරා මෙවැනි එකකට ඒකාබද්ධ කරන්නේ කෙසේද:

["$6", "$12", "$25", ...]

gist.github.com/Nishchit14/4c6a7349b3c778f7f97b912629a9f228 මෙම සබැඳිය ES5 සහ ES6 සමතලා කිරීම විස්තර කරයි
නිශ්චිත් ධනනි

20
reduce+ භාවිතා කරන සියලුම විසඳුම් concatO ((N ^ 2) / 2) වන අතර පිළිගත් පිළිතුරක් ලෙස (එක් ඇමතුමකට පමණක් concat) නරක බ්‍රව්සරයක O (N * 2) සහ O (N) a හොඳ එකක්. එසේම ඩෙනිස් විසඳුම සත්‍ය ප්‍රශ්නය සඳහා ප්‍රශස්තිකරණය කර ඇති අතර තනි ඒවාට වඩා 2x වේගවත් වේ concat. සඳහා reduceජනතාවට දැනෙන කුඩා කේතය ලිවීම සිසිල් දැනෙනවා එය අපි විනෝද නමුත් උදාහරණයක් අරාව 1000 එක් අංගයක් subarrays තිබුණේ නම් + concat විසඳුම් කරන්නේ කළ හැකි සියලු අඩු මෙහෙයුම් 500500 තනි concat හෝ සරල පුඩුවක් මෙහෙයුම් 1000 කරන්නේ ලෙස එහිදී.
gman

13
සරලව පරිශීලක පැතිරීමේ ක්‍රියාකරු[].concat(...array)
ඔලෙග් ඩේටර්

අඩු කරන්න + කොන්කට් ද්‍රාවණය O ((N ^ 2) / 2) කෙසේද? stackoverflow.com/questions/52752666/… වෙනස් සංකීර්ණතාවයක් සඳහන් කරයි.
උස්මාන්

5
ES2019 සඳහා සහය දක්වන නවතම බ්‍රව්සර් සමඟ : සමතලාarray.flat(Infinity) කළ Infinityහැකි උපරිම ගැඹුර කොහිද ?
තිමෝති ගු

Answers:


1924

concatඅරා ඒකාබද්ධ කිරීමට ඔබට භාවිතා කළ හැකිය :

var arrays = [
  ["$6"],
  ["$12"],
  ["$25"],
  ["$25"],
  ["$18"],
  ["$22"],
  ["$10"]
];
var merged = [].concat.apply([], arrays);

console.log(merged);

applyක්‍රමවේදය භාවිතා කිරීමෙන් concatදෙවන පරාමිතිය අරාව ලෙස ගනු ඇත, එබැවින් අවසාන පේළිය මෙයට සමාන වේ:

var merged2 = [].concat(["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]);

එහි ද මේ Array.prototype.flat()වුවද, ඔබ පෙලගැස්මක් නැතත් කිරීමට භාවිතා කළ හැකි වන (ES2019 මස හඳුන්වා දුන්) ක්රමය එය Internet Explorer හි සියලු දී අනුවාදය 11 සමඟ ආරම්භ නොව, Node.js පමණක් ලබා ගත හැකි .

const arrays = [
      ["$6"],
      ["$12"],
      ["$25"],
      ["$25"],
      ["$18"],
      ["$22"],
      ["$10"]
    ];
const merge3 = arrays.flat(1); //The depth level specifying how deep a nested array structure should be flattened. Defaults to 1.
console.log(merge3);
    


10
concatප්‍රභව අරාව වෙනස් නොකරන බව සලකන්න , එබැවින් mergedඇමතුමෙන් පසුව අරාව හිස්ව පවතිනු ඇත concat. : වඩා හොඳ වගේ දෙයක් කියන්නmerged = merged.concat.apply(merged, arrays);
Nate

65
var merged = [].concat.apply([], arrays);එය එක් පේළියකට ලබා ගැනීම සඳහා හොඳින් ක්‍රියා කරන බව පෙනේ. සංස්කරණය කරන්න: නිකිටාගේ පිළිතුර දැනටමත් පෙන්වන පරිදි.
ෂෝන්

44
නැත්නම් Array.prototype.concat.apply([], arrays).
danhbear

30
සටහන: මෙම පිළිතුර එක් මට්ටමක් ගැඹුරට සමතලා කරයි. පුනරාවර්තන සමතලා කිරීම සඳහා, @ ට්‍රින්ඩාස්ගේ පිළිතුර බලන්න.
ෆ්‍රොග්ස්

215
@ ෂෝන් ගේ ප්‍රකාශයට අමතරව: ඊඑස් 6 සින්ටැක්ස් මෙම සුපිරි සංක්ෂිප්ත කරයි:var merged = [].concat(...arrays)
සෙති

518

මෙන්න n- මාන අරාවක් සමතලා කිරීම සඳහා නවතම ජාවාස්ක්‍රිප්ට් අරා ක්‍රම කිහිපයක් භාවිතා කරන කෙටි ශ්‍රිතයකි.

function flatten(arr) {
  return arr.reduce(function (flat, toFlatten) {
    return flat.concat(Array.isArray(toFlatten) ? flatten(toFlatten) : toFlatten);
  }, []);
}

භාවිතය:

flatten([[1, 2, 3], [4, 5]]); // [1, 2, 3, 4, 5]
flatten([[[1, [1.1]], 2, 3], [4, 5]]); // [1, 1.1, 2, 3, 4, 5]

10
මෙම විසඳුම සඳහා මතක භාවිත පැතිකඩ කුමක්ද? වලිගය
පුනරාවර්තනය

2
තර්කයක් ලෙස හිස් අරාවක් සම්මත වන්නේ ඇයි? එය නොමැතිව කේතය කැඩී යයි, නමුත් එය කරන්නේ කුමක්ද?
ayjay

7
jayjay, එය අඩු කිරීමේ ශ්‍රිතයේ ආරම්භක සමුච්චය අගයයි, mdn ආරම්භක අගය ලෙස හඳුන්වන්නේ එයයි . මෙම අවස්ථාවේ දී එය flatනිර්නාමික ශ්‍රිතයට ලබා දුන් පළමු ඇමතුමේ වටිනාකම වේ reduce. එය නිශ්චිතව දක්වා නොමැති නම්, පළමු ඇමතුම reduceඅරාවෙන් පිටත බන්ධනය flatවන අතර එය අවසානයේ උදාහරණ දෙකටම 1බැඳී ඇත flat. 1.concatශ්‍රිතයක් නොවේ.
නෝවා ෆ්‍රීටාස්

21
නැතහොත් කෙටි, සරාගී ස්වරූපයෙන්: const flatten = (arr) => arr.reduce((flat, next) => flat.concat(next), []);
ට්වෙටොමීර් සොනෙව්

12
අත්තනෝමතික කැදැල්ල සඳහා sTsvetomirTsonev සහ නෝවාගේ විසඳුම් මත රිංගීම:const flatten = (arr) => arr.reduce((flat, next) => flat.concat(Array.isArray(next) ? flatten(next) : next), []);
Will

315

ව්යාකූල ලෙස සැඟවුණු ක්රමයක් ඇත, එය මුල් එක විකෘති නොකර නව අරාවක් සාදයි:

var oldArray = [[1],[2,3],[4]];
var newArray = Array.prototype.concat.apply([], oldArray);
console.log(newArray); // [ 1, 2, 3, 4 ]


11

8
ඔබේ පිළිතුර ප්‍රති .ලයක් [[1],[2,3],[4]]ලෙස ලබා දෙයි . Ik නිකිටා ලබා දෙන විසඳුම කෝපි ස්ක්‍රිප්ටයට මෙන්ම ජේ.එස්.
රයන් කෙනඩි

5
අහ්, මම ඔබේ වැරැද්ද සොයාගත්තා. ඔබේ අංකනයෙහි අමතර වරහන් යුගලයක් තිබේ, විය යුතුය [].concat([1],[2,3],[4],...).
රයන් කෙනඩි

21
මම හිතන්නේ මමත් ඔබේ වැරැද්ද සොයාගත්තා. මෙම ...නොහැකි සත්ය කේතය, සමහර ellipsis තිත් වේ.
amoebe

3
පුස්තකාල ශ්‍රිතයක් භාවිතා කිරීමෙන් අඩු අත්‍යවශ්‍ය "අවුලක්" ඇති බවක් අදහස් නොවේ. පුස්තකාලය තුළ අවුල සඟවා ඇති ආකාරයටම. නිසැකවම පුස්තකාලයක් භාවිතා කිරීම ඔබේම ක්‍රියාකාරිත්වය පෙරළීමට වඩා හොඳය, නමුත් මෙම තාක්ෂණය "අත්‍යවශ්‍ය අවුල්" අඩු කරන බව පැවසීම මෝඩ වැඩකි.
paldepind

206

ජාවාස්ක්‍රිප්ට් අඩු කිරීමේ ක්‍රියාකාරිත්වය මඟින් එය වඩාත් හොඳින් කළ හැකිය.

var arrays = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"], ["$0"], ["$15"],["$3"], ["$75"], ["$5"], ["$100"], ["$7"], ["$3"], ["$75"], ["$5"]];

arrays = arrays.reduce(function(a, b){
     return a.concat(b);
}, []);

නැතහොත්, ES2015 සමඟ:

arrays = arrays.reduce((a, b) => a.concat(b), []);

js-fiddle

මොසිල්ලා ලියකියවිලි


1
Oh ජෝන්ස් ඇත්ත වශයෙන්ම එක් වාරයකට එක් (අරාව) අගයක් කොන්කට් වෙත පෝෂණය අඩු කරයි. සාක්ෂි? අඩු කරන්න () ඉවත් කර එය ක්‍රියාත්මක වේදැයි බලන්න. අඩු කරන්න () මෙහි Function.prototype.apply () සඳහා විකල්පයකි
ඇන්ඩ්‍රේ වර්ලන්ග්

3
මම අඩු කිරීමද භාවිතා කර ඇත්තෙමි, නමුත් මෙම ස්නිපටයෙන් මම ඉගෙන ගත් එක් සිත්ගන්නා කරුණක් නම් බොහෝ විට ඔබට ආරම්භක අගයක් සමත් වීමට අවශ්‍ය නොවන බවයි :)
හෝසේ එෆ්. රොමානියෙලෝ

2
අඩු කිරීමේ ගැටළුව වන්නේ අරාව හිස් විය නොහැකි නිසා ඔබට අතිරේක වලංගු භාවයක් එක් කිරීමට අවශ්‍ය වනු ඇත.
calbertts

4
@calbertts ආරම්භක අගය පසුකර යන්න, []තවදුරටත් වලංගු කිරීම් අවශ්‍ය නොවේ.

8
ඔබ ES6 භාවිතා කරන බැවින්, ඔබට පැතිරීමේ ක්‍රියාකරු අරාව වචනානුසාරයෙන් භාවිතා කළ හැකිය . arrays.reduce((flatten, arr) => [...flatten, ...arr])
පුට්සි සැන්

114

මෙය හරියටම කිරීමට පැතලි නමින් නව දේශීය ක්‍රමයක් තිබේ.

(2019 අග වන විට, flatදැන් ECMA 2019 ප්‍රමිතියෙන් ප්‍රකාශයට පත් කර ඇති අතර core-js@3(බාබෙල්ගේ පුස්තකාලය ) එය ඔවුන්ගේ පොලිෆිල් පුස්තකාලයට ඇතුළත් කරයි )

const arr1 = [1, 2, [3, 4]];
arr1.flat(); 
// [1, 2, 3, 4]

const arr2 = [1, 2, [3, 4, [5, 6]]];
arr2.flat();
// [1, 2, 3, 4, [5, 6]]

// Flatten 2 levels deep
const arr3 = [2, 2, 5, [5, [5, [6]], 7]];
arr3.flat(2);
// [2, 2, 5, 5, 5, [6], 7];

// Flatten all levels
const arr4 = [2, 2, 5, [5, [5, [6]], 7]];
arr4.flat(Infinity);
// [2, 2, 5, 5, 5, 6, 7];

4
මෙය පිළිතුරු වල මුල් පිටුවේ පවා නොතිබීම ලැජ්ජාවකි. මෙම අංගය ක්‍රෝම් 69 සහ ෆයර්ෆොක්ස් 62 (සහ පසුපෙළේ වැඩ කරන අය සඳහා අංක 11) ලබා ගත හැකිය
මැට් එම්.


2
-1; නෑ, මෙය ECMAScript 2018 හි කොටසක් නොවේ . එය තවමත් කිසිදු ECMAScript පිරිවිතරයකට ඉදිරිපත් නොකළ යෝජනාවක් පමණි.
මාර්ක් අමරි

1
මම හිතන්නේ දැන් අපට මෙය සලකා බැලිය හැකිය .. මන්ද එය දැන් සම්මතයේ (2019) කොටසක් වන බැවිනි .. අපට මෙහි කාර්ය සාධන කොටස නැවත වරක් නැවත බැලීමට හැකිද?
යුවරාජ්

මයික්‍රොසොෆ්ට් බ්‍රව්සරයකින් එය තවමත් සහාය නොදක්වන බව පෙනේ (අවම වශයෙන් මම මෙම අදහස ලියන මොහොතේදී)
ලෝරන්ට් එස්.

80

මෙහි ඇති බොහෝ පිළිතුරු විශාල (උදා: මූලද්‍රව්‍ය 200 000) අරා මත ක්‍රියා නොකරයි, ඒවා එසේ වුවද ඒවා මන්දගාමී වේ. polkovnikov.ph ගේ පිළිතුරට හොඳම කාර්ය සාධනය ඇත, නමුත් එය ගැඹුරු සමතලා කිරීම සඳහා ක්‍රියා නොකරයි.

වේගවත්ම විසඳුම මෙන්න , එය විවිධ මට්ටම්වල කූඩු සහිත අරා වලද ක්‍රියා කරයි :

const flatten = function(arr, result = []) {
  for (let i = 0, length = arr.length; i < length; i++) {
    const value = arr[i];
    if (Array.isArray(value)) {
      flatten(value, result);
    } else {
      result.push(value);
    }
  }
  return result;
};

උදාහරණ

විශාල අරා

flatten(Array(200000).fill([1]));

එය විශාල අරා හසුරුවයි. මගේ පරිගණකයේ මෙම කේතය ක්‍රියාත්මක කිරීමට එම්එස් 14 ක් පමණ ගත වේ.

කැදැලි අරා

flatten(Array(2).fill(Array(2).fill(Array(2).fill([1]))));

එය කැදැලි අරා සමඟ ක්‍රියා කරයි. මෙම කේතය නිපදවයි [1, 1, 1, 1, 1, 1, 1, 1].

විවිධ මට්ටම්වල කැදැලි සහිත අරා

flatten([1, [1], [[1]]]);

මේ වගේ අරා සමතලා කිරීම සම්බන්ධයෙන් එයට කිසිදු ගැටළුවක් නොමැත.


ඔබේ විශාල අරාව හැරුණු විට තරමක් පැතලි ය. ගැඹුරින් කැදැලි අරා සඳහා මෙම විසඳුම ක්‍රියා නොකරනු ඇත. පුනරාවර්තන විසඳුමක් නොමැත. ඇත්ත වශයෙන්ම බ්‍රව්සරයක් නොමැති නමුත් සෆාරි සතුව දැන් TCO ඇත, එබැවින් පුනරාවර්තන ඇල්ගොරිතම හොඳින් ක්‍රියා නොකරයි.
නිතිපතා

lynlyly නමුත් කූඩු මට්ටම් කිහිපයකට වඩා වැඩි ගණනක් ඇති අරා ඔබට ඇත්තේ කුමන සැබෑ ලෝක තත්වය තුළද?
මයිකල් පෙරකොව්ස්කි

3
සාමාන්‍යයෙන්, පරිශීලක ජනනය කළ අන්තර්ගතයෙන් අරාව ජනනය කරන විට.
nily

X 0xcaff Chrome හි එය මූලද්‍රව්‍ය 200 000 අරාව සමඟ කිසිසේත් ක්‍රියා නොකරයි (ඔබට ලැබෙනු ඇත RangeError: Maximum call stack size exceeded). මූලද්‍රව්‍ය 20 000 ක් සඳහා මිලි තත්පර 2-5 ක් ගතවේ.
මයිකල් පෙරකෝව්ස්කි

3
මෙහි O අංකන සංකීර්ණතාව කුමක්ද?
ජෝර්ජ් කට්සානෝස්

60

යාවත්කාලීන කිරීම: මෙම විසඳුම විශාල අරා සමඟ ක්‍රියා නොකරන බව පෙනී ගියේය. එය ඔබ වඩා හොඳ වේගවත් විසඳුමක් සොයමින් සිටී, මෙම පිළිතුර බලන්න .


function flatten(arr) {
  return [].concat(...arr)
}

හුදෙක් විස්තාරණය arrවී එය තර්ක ලෙස සම්මත කරයි, එය concat()සියලු අරා එකකට ඒකාබද්ධ කරයි. එය සමාන වේ [].concat.apply([], arr).

ගැඹුරු සමතලා කිරීම සඳහා ඔබට මෙය උත්සාහ කළ හැකිය:

function deepFlatten(arr) {
  return flatten(           // return shalowly flattened array
    arr.map(x=>             // with each x in array
      Array.isArray(x)      // is x an array?
        ? deepFlatten(x)    // if yes, return deeply flattened x
        : x                 // if no, return just x
    )
  )
}

JSBin හි නිරූපණය බලන්න .

මෙම පිළිතුර සඳහා භාවිතා කරන ලද ECMAScript 6 මූලද්‍රව්‍ය සඳහා යොමුව:


පැති සටහන: වැනි ක්‍රම find()සහ ඊතල ක්‍රියාකාරිත්වයන් සියලු බ්‍රව්සර් මගින් සහය නොදක්වයි, නමුත් එයින් අදහස් කරන්නේ ඔබට දැන් මෙම විශේෂාංග භාවිතා කළ නොහැකි බවයි. බාබෙල් භාවිතා කරන්න - එය ES6 කේතය ES5 බවට පරිවර්තනය කරයි.


මෙහි ඇති සියලුම පිළිතුරු පාහේ applyමේ ආකාරයෙන් අනිසි ලෙස භාවිතා කර ඇති නිසා, මම ඔබේ අදහස් ඔබගේ අදහස් වලින් ඉවත් කළෙමි. මම තවමත් සිතන්නේ applyමේ ආකාරයට භාවිතා කිරීම / පැතිරීම නරක

@ LUH3417 එය එසේ නොවේ, ඔබගේ අදහස් මම අගය කරමි. එය ඔබ නිවැරදියි - මෙම විසඳුම ඇත්ත වශයෙන්ම විශාල අරා සමඟ ක්‍රියා නොකරයි. මූලද්‍රව්‍ය 200 000 ක අරා සමඟ වුවද හොඳින් ක්‍රියාත්මක වන තවත් පිළිතුරක් මම පළ කළෙමි .
මයිකල් පෙරකොව්ස්කි

ඔබ ES6 භාවිතා කරන්නේ නම්, ඔබට තව දුරටත් අඩු කළ හැකිය:const flatten = arr => [].concat(...arr)
Eruant

"විශාල අරා සමඟ ක්‍රියා නොකරයි" යනුවෙන් ඔබ අදහස් කරන්නේ කුමක්ද? කොතරම් විශාලද? සිදුවන්නේ කුමක් ද?
GEMI

4
EMGEMI උදාහරණයක් ලෙස මෙම ක්‍රමය භාවිතා කරමින් මූලද්‍රව්‍ය 500000 ක අරා පැතලි කිරීමට උත්සාහ කිරීමෙන් "පරාසය දෝෂය: උපරිම ඇමතුම් තොගයේ ප්‍රමාණය ඉක්මවා ඇත".
මයිකල් පෙරකෝව්ස්කි

51

ඔබට අන්ඩර්ස්කෝර් භාවිතා කළ හැකිය :

var x = [[1], [2], [3, 4]];

_.flatten(x); // => [1, 2, 3, 4]

20
කවුද, කවුරුහරි පර්ල්ව JS ට එකතු කළාද? :-)
ජේබීආර් විල්කින්සන්

9
@ ජේ.බී.ආර්.විල්කින්සන් සමහර විට ජේ.එස් ඔබට හොඳ යහපතක් සඳහා හැස්කෙල් ඉගෙන ගැනීමට අවශ්‍ය වේවිද?
ස්ටයිෆල්

1+ - ඔබ ද ඔබ නොගැඹුරු මාලාවක් බිමට සමතලා අවශ්ය බව සඳහන් කළ හැකිය නියම විසින් trueඑම දෙවැනි තර්කයේ සඳහා .
ජොෂ් ක්‍රොසියර්

7
@ Styfle ගේ ප්‍රකාශය පිළිබඳ සම්පූර්ණත්වය උදෙසා: learnnyouahaskell.com
සයිමන් ඒ. ඉග්ස්ටර්

41

සාමාන්‍ය ක්‍රියා පටිපාටිවලින් අදහස් කරන්නේ අපට නිශ්චිත හැසිරීමක් භාවිතා කිරීමට අවශ්‍ය සෑම අවස්ථාවකම සංකීර්ණත්වය නැවත ලිවිය යුතු නැති බවයි.

concatMap(හෝ flatMap) මෙම තත්වය තුළ අපට අවශ්‍ය වන්නේ හරියටම ය.

// concat :: ([a],[a]) -> [a]
const concat = (xs,ys) =>
  xs.concat (ys)

// concatMap :: (a -> [b]) -> [a] -> [b]
const concatMap = f => xs =>
  xs.map(f).reduce(concat, [])

// id :: a -> a
const id = x =>
  x

// flatten :: [[a]] -> [a]
const flatten =
  concatMap (id)

// your sample data
const data =
  [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]]

console.log (flatten (data))

දුරදක්නා නුවණ

ඔව්, ඔබ එය නිවැරදිව අනුමාන කළා, එය එක් මට්ටමක් පමණක් සමතලා කරයි, එය හරියටම ක්‍රියා කළ යුතු ආකාරයයි

මේ වගේ දත්ත කට්ටලයක් ගැන සිතන්න

// Player :: (String, Number) -> Player
const Player = (name,number) =>
  [ name, number ]

// team :: ( . Player) -> Team
const Team = (...players) =>
  players

// Game :: (Team, Team) -> Game
const Game = (teamA, teamB) =>
  [ teamA, teamB ]

// sample data
const teamA =
  Team (Player ('bob', 5), Player ('alice', 6))

const teamB =
  Team (Player ('ricky', 4), Player ('julian', 2))

const game =
  Game (teamA, teamB)

console.log (game)
// [ [ [ 'bob', 5 ], [ 'alice', 6 ] ],
//   [ [ 'ricky', 4 ], [ 'julian', 2 ] ] ]

හරි, දැන් කියන්න අපට සහභාගී වන සියලුම ක්‍රීඩකයින් පෙන්වන ලැයිස්තුවක් මුද්‍රණය කිරීමට අවශ්‍ය බව game

const gamePlayers = game =>
  flatten (game)

gamePlayers (game)
// => [ [ 'bob', 5 ], [ 'alice', 6 ], [ 'ricky', 4 ], [ 'julian', 2 ] ]

අපගේ flattenක්‍රියා පටිපාටිය කැදැලි අරා ද සමතලා කර ඇත්නම් , අපි මෙම කසළ ප්‍රති result ලයෙන් අවසන් වෙමු.

const gamePlayers = game =>
  badGenericFlatten(game)

gamePlayers (game)
// => [ 'bob', 5, 'alice', 6, 'ricky', 4, 'julian', 2 ]

රෝලින් ගැඹුරු, බබා

සමහර විට ඔබට කැදැලි අරා සමතලා කිරීමට අවශ්‍ය නොවන බව නොකියයි - එය සුපුරුදු හැසිරීම නොවිය යුතුය.

අපට deepFlattenපහසුවෙන් ක්‍රියා පටිපාටියක් කළ හැකිය…

// concat :: ([a],[a]) -> [a]
const concat = (xs,ys) =>
  xs.concat (ys)

// concatMap :: (a -> [b]) -> [a] -> [b]
const concatMap = f => xs =>
  xs.map(f).reduce(concat, [])

// id :: a -> a
const id = x =>
  x

// flatten :: [[a]] -> [a]
const flatten =
  concatMap (id)

// deepFlatten :: [[a]] -> [a]
const deepFlatten =
  concatMap (x =>
    Array.isArray (x) ? deepFlatten (x) : x)

// your sample data
const data =
  [0, [1, [2, [3, [4, 5], 6]]], [7, [8]], 9]

console.log (flatten (data))
// [ 0, 1, [ 2, [ 3, [ 4, 5 ], 6 ] ], 7, [ 8 ], 9 ]

console.log (deepFlatten (data))
// [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

එතන. දැන් ඔබට සෑම රැකියාවක් සඳහාම මෙවලමක් තිබේ - එකක් කැදැල්ල එක් මට්ටමක තබා flattenගැනීම සඳහා වන අතර එක් කැදැල්ලක් මකා දැමීම සඳහා එකක් deepFlatten.

සමහර විට ඔබට එය ඇමතිය හැකිය obliterateහෝ nukeඔබ නමට අකමැති නම් deepFlatten.


දෙවරක් නැවත කියන්න එපා!

ඇත්ත වශයෙන්ම ඉහත ක්‍රියාත්මක කිරීම් දක්ෂ හා සංක්ෂිප්ත ය, නමුත් .mapඇමතුමකින් පසුව ඇමතුමක් භාවිතා කිරීමෙන් .reduceඅදහස් කරන්නේ අප අවශ්‍ය ප්‍රමාණයට වඩා වැඩි වාර ගණනක් කරන බවයි

මා අමතන්නේ mapReduceවිශ්වාසදායක සංයෝජකයක් භාවිතා කිරීම පුනරාවර්තනයන් අවම මට්ටමක තබා ගැනීමට උපකාරී වේ; එය සිතියම්කරණ ශ්‍රිතයක් m :: a -> b, අඩු කිරීමේ ශ්‍රිතයක් r :: (b,a) ->bගෙන නව අඩු කිරීමේ ශ්‍රිතයක් ලබා දෙයි - මෙම සංයෝජකය සම්ප්‍රේෂකයන්ගේ හදවතේ ඇත ; ඔබ කැමති නම්, මම ඔවුන් ගැන වෙනත් පිළිතුරු ලියා ඇත

// mapReduce = (a -> b, (b,a) -> b, (b,a) -> b)
const mapReduce = (m,r) =>
  (acc,x) => r (acc, m (x))

// concatMap :: (a -> [b]) -> [a] -> [b]
const concatMap = f => xs =>
  xs.reduce (mapReduce (f, concat), [])

// concat :: ([a],[a]) -> [a]
const concat = (xs,ys) =>
  xs.concat (ys)

// id :: a -> a
const id = x =>
  x

// flatten :: [[a]] -> [a]
const flatten =
  concatMap (id)
  
// deepFlatten :: [[a]] -> [a]
const deepFlatten =
  concatMap (x =>
    Array.isArray (x) ? deepFlatten (x) : x)

// your sample data
const data =
  [ [ [ 1, 2 ],
      [ 3, 4 ] ],
    [ [ 5, 6 ],
      [ 7, 8 ] ] ]

console.log (flatten (data))
// [ [ 1. 2 ], [ 3, 4 ], [ 5, 6 ], [ 7, 8 ] ]

console.log (deepFlatten (data))
// [ 1, 2, 3, 4, 5, 6, 7, 8 ]


බොහෝ විට, ඔබගේ පිළිතුරු දුටු විට මට මගේ මුදල් ආපසු ගැනීමට අවශ්‍යය, මන්ද ඒවා නිෂ් .ල වී ඇත. නියම පිළිතුර! concatම දක්වා අඩුක්කුව පමණක් නාස්ති කරන්නේ නැහැ ...සහ apply(ඉතා විශාල පෙලගැස්මක් සමග) කරන්නේ. මම ඒක දැක්කේ නැහැ. මට දැන් භය දැනෙනවා.

U LUH3417 ඔබට භය නොවිය යුතුය. හොඳින් ලියා ඇති පැහැදිලි කිරීම් සමඟ ඔබ හොඳ පිළිතුරු සපයයි. මෙහි ඇති සෑම දෙයක්ම ඉගෙනීමේ අත්දැකීමකි - මම බොහෝ විට වැරදි කරන අතර නරක පිළිතුරු ද ලියමි. මම මාස දෙකකින් ඒවා නැවත සලකා බලා "wtf මම හිතුවාද?" දේවල් සම්පූර්ණයෙන්ම සංශෝධනය කිරීම අවසන් කරන්න. පිළිතුරක් පරිපූර්ණ නොවේ. අපි සියල්ලෝම යම්
ස්තූතියි

1
concatජාවාස්ක්‍රිප්ට් හි හස්කල්ට වඩා වෙනස් අර්ථයක් ඇති බව කරුණාවෙන් සලකන්න . හස්කල්ගේ concat( [[a]] -> [a]) flattenජාවාස්ක්‍රිප්ට් හි කැඳවනු ලබන අතර එය ක්‍රියාත්මක වන්නේ foldr (++) [](ජාවාස්ක්‍රිප්ට්: foldr(concat) ([])ව්‍යංජන කාර්යයන් උපකල්පනය කිරීම) ලෙස ය. කරුණාකර Javascript ගේ concat(අ අමුතු ඇතුලත් වේ (++)යන දෙකම පිළිබඳව කටයුතු කළ හැකි, Haskell දී) [a] -> [a] -> [a]සහ a -> [a] -> [a].

මම හිතන්නේ වඩා හොඳ නමක් තිබුනේ flatMap, මන්ද එය හරියටම එයයි concatMap: මොනාඩ්හි bindඋදාහරණය list. concatpMapලෙස ක්‍රියාත්මක වේ foldr ((++) . f) []. ජාවාස්ක්‍රිප්ට් වලට පරිවර්තනය කර ඇත : const flatMap = f => foldr(comp(concat) (f)) ([]). මෙය ඇත්ත වශයෙන්ම ඔබගේ ක්‍රියාත්මක කිරීම හා සමාන වේ comp.

එම ඇල්ගොරිතමයේ සංකීර්ණතාව කුමක්ද?
ජෝර්ජ් කට්සානෝස්

32

ඔබේ අරාවෙහි අරාව නොවන මූලද්‍රව්‍ය කිහිපයක් තිබිය හැකි විට වඩාත් පොදු අවස්ථාව සඳහා විසඳුමක්.

function flattenArrayOfArrays(a, r){
    if(!r){ r = []}
    for(var i=0; i<a.length; i++){
        if(a[i].constructor == Array){
            r.concat(flattenArrayOfArrays(a[i], r));
        }else{
            r.push(a[i]);
        }
    }
    return r;
}

4
JsonPath විමසුමකින් ඔබට ලැබෙන ප්‍රති result ල කට්ටලවල කැදැලි අරා ආකෘතිය සමතලා කිරීමට මෙම ප්‍රවේශය ඉතා effective ලදායී විය .
kevinjansz

1
අරා ක්‍රමයක් ලෙස එකතු කරන ලදි:Object.defineProperty(Array.prototype,'flatten',{value:function(r){for(var a=this,i=0,r=r||[];i<a.length;++i)if(a[i]!=null)a[i] instanceof Array?a[i].flatten(r):r.push(a[i]);return r}});
ෆ්‍රොග්ස්

අපි දෙවන තර්කය අතින් සම්මත කළහොත් මෙය බිඳී යනු ඇත. උදාහරණයක් ලෙස, මෙය උත්සාහ කරන්න: flattenArrayOfArrays (arr, 10)හෝ මෙය flattenArrayOfArrays(arr, [1,[3]]);- එම දෙවන තර්ක ප්‍රතිදානයට එකතු කරනු ලැබේ.
ඕම් ශංකර්

2
මෙම පිළිතුර සම්පූර්ණ නැත!
පුනරාවර්තනයේ ප්‍රති result ලය

1
3 r3wt ඉදිරියට ගොස් නිවැරදි කිරීමක් එක් කළේය. ඔබ කළ යුත්තේ ඔබ නඩත්තු කරන වර්තමාන අරාව rසැබවින්ම පුනරාවර්තනයේ ප්‍රති results ල සමපාත වන බවට වග බලා ගැනීමයි .
aug

30

තනි මූලද්‍රව්‍ය අරා සමූහයක් සමතලා කිරීම සඳහා, ඔබට පුස්තකාලයක් ආයාත කිරීමට අවශ්‍ය නැත, සරල පුඩුවක් යනු සරලම හා කාර්යක්ෂම විසඳුමයි:

for (var i = 0; i < a.length; i++) {
  a[i] = a[i][0];
}

පහත් ඡන්ද දායකයින්ට: කරුණාකර ප්‍රශ්නය කියවන්න, එය ඔබගේ වෙනස් ගැටළුවට නොගැලපෙන නිසා පහත් කොට සලකන්න එපා. මෙම විසඳුම අසන ලද ප්‍රශ්නය සඳහා වේගවත්ම හා සරලම වේ.


4
මම කියන්නේ, "වඩා ගුප්ත දේවල් සොයන්න එපා." ^^

4
මම කිව්වේ ... ඒ සඳහා පුස්තකාලයක් භාවිතා කිරීමට මිනිසුන් උපදෙස් දෙන ආකාරය දුටු විට ... එය පිස්සු ...
ඩෙනිස් සේගුරෙට්

3
Ahh, පුස්තකාල භාවිතා කිරීමට පමණක් මේ සඳහා මෝඩ වනු ඇත ... නමුත් එය මේ වන විටත් ලබා ගත හැකි වේ නම්.

9
@dystroy for for loop හි කොන්දේසි සහිත කොටස එය කියවිය නොහැක. නැතහොත් එය මා පමණක් ද: ඩී
ඇන්ඩ්‍රියාස්

4
එය කෙතරම් ගුප්තද යන්න ඇත්ත වශයෙන්ම වැදගත් නොවේ. මෙම කේතය මෙම "flattens" ['foo', ['bar']]කිරීමට ['f', 'bar'].
jonschlinkert

30

reduce(callback[, initialValue])ක්‍රමවේදය භාවිතා කිරීම ගැන කුමක් කිව හැකිද?JavaScript 1.8

list.reduce((p,n) => p.concat(n),[]);

වැඩේ කරයි.


8
[[1], [2,3]].reduce( (a,b) => a.concat(b), [] )වඩා සරාගී ය.
ගොලොපොට්

5
අපගේ නඩුවේ දෙවන තර්කය අවශ්‍ය නැත[[1], [2,3]].reduce( (a,b) => a.concat(b))
උමීර් අහමඩ්

29

ක්‍රියාකාරී ශෛලියේ තවත් ECMAScript 6 විසඳුමක්:

ශ්‍රිතයක් ප්‍රකාශ කරන්න:

const flatten = arr => arr.reduce(
  (a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []
);

එය භාවිතා කරන්න:

flatten( [1, [2,3], [4,[5,[6]]]] ) // -> [1,2,3,4,5,6]

 const flatten = arr => arr.reduce(
         (a, b) => a.concat(Array.isArray(b) ? flatten(b) : b), []
       );


console.log( flatten([1, [2,3], [4,[5],[6,[7,8,9],10],11],[12],13]) )

නවීන බ්‍රව්සර්වල අවසාන නිකුතුවල ඇති Array.prototype.flat () (ES6 සඳහා වන යෝජනාව ) ස්වදේශීය ශ්‍රිතයක් ද සලකා බලන්න . Comments (Ван) සහ @ (මාර්ක් අමරි) ට ස්තූතියි එය අදහස් දැක්වීමේදී සඳහන් කර ඇත.

මෙම flatඋත්සවය හා සමාන මාලාවක් කුරුල්ලන් ලැග සිටින, අපේක්ෂිත ගැඹුර නියම කරමින්, එක් පරාමිතිය ඇත 1පෙරනිමියෙන්.

[1, 2, [3, 4]].flat();                  // -> [1, 2, 3, 4]

[1, 2, [3, 4, [5, 6]]].flat();          // -> [1, 2, 3, 4, [5, 6]]

[1, 2, [3, 4, [5, 6]]].flat(2);         // -> [1, 2, 3, 4, 5, 6]

[1, 2, [3, 4, [5, 6]]].flat(Infinity);  // -> [1, 2, 3, 4, 5, 6]

let arr = [1, 2, [3, 4]];

console.log( arr.flat() );

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

console.log( arr.flat() );
console.log( arr.flat(1) );
console.log( arr.flat(2) );
console.log( arr.flat(Infinity) );


3
මෙය කදිම හා පිළිවෙලයි නමුත් මම හිතන්නේ ඔබ ES6 අධික මාත්‍රාවක් කර ඇති බවයි. ඊතල ශ්‍රිතයක් වීමට පිටත ශ්‍රිතයේ අවශ්‍යතාවයක් නොමැත. ඇමතුම් අඩු කිරීම සඳහා මම ඊතල ශ්‍රිතය සමඟ බැඳී සිටින නමුත් සමතලා කිරීම සාමාන්‍ය කාර්යයක් විය යුතුය.
ස්ටීවන් සිම්සන්

3
Te ස්ටෙෆෙන්සිම්ප්සන් නමුත් පිටත ශ්‍රිතය ඇරෝ නොවන ශ්‍රිතයක් වීමට අවශ්‍යතාවයක් තිබේද? "සමතලා කිරීම සාමාන්‍ය කාර්යයක් විය යුතුය" - "සාමාන්‍ය" යන්නෙන් ඔබ අදහස් කරන්නේ "ඊතලය නොවන" යන්නයි, නමුත් ඇයි? එය අඩු කිරීම සඳහා ඇමතුමේ ඊතල ශ්‍රිතයක් භාවිතා කරන්නේ ඇයි ? ඔබේ තර්කය ඉදිරිපත් කළ හැකිද?
ස්තූතියි

1
@naomik මගේ තර්කය නම් එය අනවශ්‍ය බවයි. එය ප්රධාන වශයෙන් ශෛලිය පිළිබඳ කාරණයකි; මගේ අදහස් දැක්වීමේදී මට වඩා පැහැදිලි විය යුතුය. එකක් හෝ වෙනත් එකක් භාවිතා කිරීමට ප්‍රධාන කේතීකරණ හේතුවක් නොමැත. කෙසේ වෙතත්, ශ්‍රිතය ඊතල නොවන ලෙස දැකීමට සහ කියවීමට පහසුය. ඊතල ශ්‍රිතයක් ලෙස අභ්‍යන්තර ක්‍රියාකාරිත්වය වඩාත් සංයුක්ත බැවින් ප්‍රයෝජනවත් වේ (ඇත්ත වශයෙන්ම කිසිදු සන්දර්භයක් නිර්මාණය වී නොමැත). සංයුක්ත පහසුවෙන් කියවිය හැකි ශ්‍රිතයක් නිර්මාණය කිරීමට සහ මෙම ව්‍යාකූලත්වය මඟහරවා ගැනීමට ඊතල ශ්‍රිත විශිෂ්ටයි. කෙසේ වෙතත්, ඊතලයක් නොවන විට ප්‍රමාණවත් වන විට ඒවා කියවීම වඩාත් අපහසු කරයි. අනෙක් අය ඊට එකඟ නොවිය හැකියි!
ස්ටීවන් සිම්සන්

ලබා ගැනීමRangeError: Maximum call stack size exceeded
මැට් වෙස්ට්ලේක්

Att මැට්, කරුණාකර ඔබ දෝෂය ප්‍රතිනිෂ්පාදනය කිරීමට භාවිතා කරන ප්‍රභවය බෙදා ගන්න
diziaq

22
const common = arr.reduce((a, b) => [...a, ...b], [])

මගේ කේතය පුරාවටම මම මෙය කරන්නේ නමුත් ඔබට ඉතා දිගු අරාවක් තිබේ නම් පිළිගත් පිළිතුර සමඟ වේගය සැසඳෙන්නේ කෙසේදැයි මට විශ්වාස නැත
මයිකල් ආරොන් විල්සන්

14

කරුණාකර සලකන්න: විට Function.prototype.apply( [].concat.apply([], arrays)) හෝ පැතිරීම ක්රියාකරු ( [].concat(...arrays)උත්සවයකට සෑම තර්කය අඩුක්කුව ගබඩා කර ඇති නිසා මාලාවක් නැතත් කිරීම සඳහා) භාවිතා කරනු ඇත, යන දෙකම හැකි හේතුවක් අඩුක්කුව විශාල පෙලගැස්මක් සඳහා උතුරා යන.

එකිනෙකාට එරෙහිව වඩාත්ම වැදගත් අවශ්‍යතා කිරා මැන බලන ක්‍රියාකාරී ශෛලියේ සිරස්-ආරක්ෂිත ක්‍රියාත්මක කිරීමක් මෙන්න:

  • නැවත භාවිතා කිරීමේ හැකියාව
  • කියවීමේ හැකියාව
  • සංක්ෂිප්තභාවය
  • කාර්ය සාධනය

// small, reusable auxiliary functions:

const foldl = f => acc => xs => xs.reduce(uncurry(f), acc); // aka reduce

const uncurry = f => (a, b) => f(a) (b);

const concat = xs => y => xs.concat(y);


// the actual function to flatten an array - a self-explanatory one-line:

const flatten = xs => foldl(concat) ([]) (xs);

// arbitrary array sizes (until the heap blows up :D)

const xs = [[1,2,3],[4,5,6],[7,8,9]];

console.log(flatten(xs));


// Deriving a recursive solution for deeply nested arrays is trivially now


// yet more small, reusable auxiliary functions:

const map = f => xs => xs.map(apply(f));

const apply = f => a => f(a);

const isArray = Array.isArray;


// the derived recursive function:

const flattenr = xs => flatten(map(x => isArray(x) ? flattenr(x) : x) (xs));

const ys = [1,[2,[3,[4,[5],6,],7],8],9];

console.log(flattenr(ys));

ව්‍යංජන ස්වරූපයෙන්, ක්‍රියාකාරී සංයුතියෙන් සහ ඉහළ පෙළේ ශ්‍රිත වලින් කුඩා ඊතල ශ්‍රිතවලට ඔබ පුරුදු වූ වහාම මෙම කේතය ගද්‍ය වැනි කියවනු ලැබේ. ක්‍රමලේඛනය යනු හුදෙක් අපේක්ෂිත පරිදි ක්‍රියා කරන කුඩා ගොඩනැඟිලි කොටස් එකට එකතු කිරීම පමණි.


1
හාහා. ඔබේ පිළිතුරට සම්පුර්ණයෙන්ම ගරු කරන්න, මේ වගේ ක්‍රියාකාරී වැඩසටහන් කියවීම තවමත් ජපන් අක්ෂර මට අක්‍ෂරයෙන් කියවීම හා සමානයි (ඉංග්‍රීසි කථිකයා).
ටාවින් ස්ට්‍රෝ-ස්පයිජර්

2
මෙය හරියටම කිරීමේ එකම අරමුණ ඇතිව ව්‍යාපෘතියේ කොටසක් ලෙස නොව භාෂාවේ A භාෂාවේ අංග ක්‍රියාත්මක කරන බව ඔබ දුටුවහොත්, කොතැනක හෝ යමෙකු වැරදි හැරීමක් කර තිබේ. ඒ ඔබ විය හැකිද? ඔබ සමඟ යාමෙන් const flatten = (arr) => arr.reduce((a, b) => a.concat(b), []);ඔබට අමතර කාර්යයන් 3 ක් අවශ්‍ය වන්නේ ඇයිද යන්න සහ සමහර ක්‍රියාකාරී ඇමතුම්ද ඔබේ කණ්ඩායමේ සාමාජිකයින්ට දෘශ්‍ය කසළ සහ පැහැදිලි කිරීම ඉතිරි කරයි.
ඩර්ඩමන්ඩ්

3
ADaerdemandt නමුත් ඔබ එය වෙනම කාර්යයන් ලෙස ලියන්නේ නම්, ඔබට ඒවා වෙනත් කේතයකින් නැවත භාවිතා කිරීමට හැකි වනු ඇත.
මයිකල් පෙරකෝව්ස්කි

@ MichałPerłakowski ඔබ ස්ථාන කිහිපයක ඔවුන් භාවිතා කිරීමට අවශ්ය නම්, අලුත් යාන්ත්රණයක් සිට පැකේජයක් තෝරා නොගන්නා මෙම - වාර්තා කිරීම සහ අනෙක් ජනයා විසින් ආධාර.
ඩර්ඩෙමන්ඩ්

12

ES6 One Line පැතලි

බලන්න lodash නැතත් , underscore නැතත් (නොගැඹුරු true)

function flatten(arr) {
  return arr.reduce((acc, e) => acc.concat(e), []);
}

හෝ

function flatten(arr) {
  return [].concat.apply([], arr);
}

සමඟ පරීක්ෂා කර ඇත

test('already flatted', () => {
  expect(flatten([1, 2, 3, 4, 5])).toEqual([1, 2, 3, 4, 5]);
});

test('flats first level', () => {
  expect(flatten([1, [2, [3, [4]], 5]])).toEqual([1, 2, [3, [4]], 5]);
});

ES6 එක් පේළියක් ගැඹුරු සමතලා වේ

ලොඩාෂ් පැතලි ඩීප් බලන්න , අවධාරනය කරන්න පැතලි කරන්න

function flattenDeep(arr) {
  return arr.reduce((acc, e) => Array.isArray(e) ? acc.concat(flattenDeep(e)) : acc.concat(e), []);
}

සමඟ පරීක්ෂා කර ඇත

test('already flatted', () => {
  expect(flattenDeep([1, 2, 3, 4, 5])).toEqual([1, 2, 3, 4, 5]);
});

test('flats', () => {
  expect(flattenDeep([1, [2, [3, [4]], 5]])).toEqual([1, 2, 3, 4, 5]);
});

ඔබගේ 2 වන උදාහරණය වඩා හොඳින් ලියා ඇත්තේ Array.prototype.concat.apply([], arr)ඔබ concatශ්‍රිතයට පිවිසීම සඳහා අතිරේක අරාවක් නිර්මාණය කරන බැවිනි . ධාවන වේලාවන් එය ක්‍රියාත්මක කරන විට එය ප්‍රශස්තිකරණය කිරීමට හෝ නොවීමට ඉඩ ඇත, නමුත් මූලාකෘතියේ ක්‍රියාකාරිත්වයට ප්‍රවේශ වීම මේ වන විටත් ඇති තත්වයට වඩා අවලස්සන බවක් නොපෙනේ.
මරේ

11

ඔබට භාවිතා කළ හැකි Array.flat()සමග Infinityපිළිතුරු පැතැලිව මාලාවක් කිසිදු ගැඹුරක් සඳහා.

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

let flatten = arr.flat(Infinity)

console.log(flatten)

බ්‍රව්සර් අනුකූලතාව සඳහා මෙහි පරීක්ෂා කරන්න


8

ඔබට ඇත්තේ 1 නූල් මූලද්‍රව්‍යයක් සහිත අරා පමණි:

[["$6"], ["$12"], ["$25"], ["$25"]].join(',').split(',');

වැඩේ කරයි. ඔබේ කේත උදාහරණයට විශේෂයෙන් ගැලපෙන Bt.


3
කවුරුන් ඡන්දය දුන්නත්, කරුණාකර එයට හේතුව පැහැදිලි කරන්න. මම හොඳ විසඳුමක් සොයමින් සිටි අතර සියලු විසඳුම් වලින් මම මේකට වඩාත්ම කැමති විය.
නිර්නාමික

2
N නිර්නාමික එය තාක්‍ෂණිකව ප්‍රශ්නයේ අවශ්‍යතාවයන් සපුරාලන බැවින් මම එය අවතක්සේරු නොකළ නමුත් එය සාමාන්‍ය නඩුවේ ප්‍රයෝජනවත් නොවන ඉතා දුර්වල විසඳුමක් නිසා විය හැකිය. මෙහි වඩා හොඳ විසඳුම් කීයක් තිබේද යන්න සලකා බැලීමේදී, ඔබට එක මූලද්‍රව්‍යයකට වඩා ඇති මොහොත බිඳෙන විට හෝ ඒවා නූල් නොමැති විට කිසිවෙකු මේ සමඟ යාමට මම නිර්දේශ නොකරමි.
Thor84no

2
මම මෙම විසඳුමට කැමතියි =)
හියු ටැන්

2
එය නූල් 1 ක් සහිත අරා පමණක් හසුරුවන්නේ නැත, එයද මෙම අරාව හසුරුවයි ['$4', ["$6"], ["$12"], ["$25"], ["$25", "$33", ['$45']]].join(',').split(',')
alucic

මම මෙම ක්‍රමය තනිවම සොයාගත්තෙමි, කෙසේ වෙතත් එය දැනටමත් කොතැනක හෝ ලේඛනගත කර තිබිය යුතු බව දැන සිටියද, මගේ සෙවීම මෙතැනින් අවසන් විය. මෙම විසඳුමේ ඇති අඩුපාඩුව නම්, එය සංඛ්‍යා, බූලියන් යනාදිය නූල් වලට බල කරයි, උත්සාහ කරන්න [1,4, [45, 't', ['e3', 6]]].toString().split(',') ---- හෝ ----- [1,4, [45, 't', ['e3', 6], false]].toString().split(',')
සුදාන්සු චෞද්රි

8

හස්කෙලෙස්ක් ප්රවේශය

function flatArray([x,...xs]){
  return x ? [...Array.isArray(x) ? flatArray(x) : [x], ...flatArray(xs)] : [];
}

var na = [[1,2],[3,[4,5]],[6,7,[[[8],9]]],10];
    fa = flatArray(na);
console.log(fa);


1
@Monners සමඟ එකඟ වන්න. මෙම සම්පූර්ණ ත්‍රෙඩ් එකේ වඩාත්ම අලංකාර විසඳුම ලබා දෙයි.
නිකොලස් ෆැන්ටෝන්

8

ES6 මාර්ගය:

const flatten = arr => arr.reduce((acc, next) => acc.concat(Array.isArray(next) ? flatten(next) : next), [])

const a = [1, [2, [3, [4, [5]]]]]
console.log(flatten(a))

flattenN-times කැදැලි අරා සඳහා ES3 වැටීම සමඟ ක්‍රියා කිරීමට ES5 මාර්ගය :

var flatten = (function() {
  if (!!Array.prototype.reduce && !!Array.isArray) {
    return function(array) {
      return array.reduce(function(prev, next) {
        return prev.concat(Array.isArray(next) ? flatten(next) : next);
      }, []);
    };
  } else {
    return function(array) {
      var arr = [];
      var i = 0;
      var len = array.length;
      var target;

      for (; i < len; i++) {
        target = array[i];
        arr = arr.concat(
          (Object.prototype.toString.call(target) === '[object Array]') ? flatten(target) : target
        );
      }

      return arr;
    };
  }
}());

var a = [1, [2, [3, [4, [5]]]]];
console.log(flatten(a));


8

ඔබට නව Array.Flat()ක්‍රමය ද උත්සාහ කළ හැකිය . එය පහත පරිදි ක්‍රියා කරයි:

let arr = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]].flat()

console.log(arr);

මෙම flat()ක්‍රමය මඟින් සියලු උප-අරා මූලද්‍රව්‍යයන් ගැඹුරට 1 ස්ථරය දක්වා පුනරාවර්තන ලෙස නව අරා නිර්මාණය කරයි (එනම් අරා ඇතුළත අරා)

ඔබට ත්‍රිමාන හෝ ඊටත් වඩා ඉහළ මාන අරා සමතලා කිරීමට අවශ්‍ය නම් ඔබ පැතලි ක්‍රමය කිහිප වතාවක් අමතන්න. උදාහරණයක් ලෙස (මානයන් 3):

let arr = [1,2,[3,4,[5,6]]].flat().flat().flat();

console.log(arr);

පරෙස්සම් වෙන්න!

Array.Flat()ක්‍රමය සාපේක්ෂව නව ය. වැනි පැරණි බ්‍රව්සර් ක්‍රමය ක්‍රියාත්මක නොකරන්නට ඇත. සියලුම බ්‍රව්සර්වල වැඩ කිරීමට ඔබට කේතයක් අවශ්‍ය නම්, ඔබේ ජේඑස් පැරණි අනුවාදයකට සම්ප්‍රේෂණය කළ යුතුය. වත්මන් බ්‍රව්සර් අනුකූලතාව සඳහා MD වෙබ් ලියකියවිලි පරීක්ෂා කරන්න.


2
ඉහළ මානයන් සහිත අරා පැතලි කිරීමට ඔබට සරලවම Infinityතර්කයෙන් පැතලි ක්‍රමය හැඳින්විය හැකිය . මේ වගේ:arr.flat(Infinity)
මිහායිල්

7
var arrays = [["a"], ["b", "c"]];
Array.prototype.concat.apply([], arrays);

// gives ["a", "b", "c"]

(මම මෙය ලියන්නේ වෙනම පිළිතුරක් ලෙසයි, ඩැන්බයර්ගේ අදහස් මත පදනම්ව.)


7

අවකාශ-කාර්යක්ෂම උත්පාදක ශ්‍රිතයක් මම නිර්දේශ කරමි :

function* flatten(arr) {
  if (!Array.isArray(arr)) yield arr;
  else for (let el of arr) yield* flatten(el);
}

// Example:
console.log(...flatten([1,[2,[3,[4]]]])); // 1 2 3 4

අවශ්‍ය නම්, සමතලා කළ අගයන් පෙළක් පහත පරිදි සාදන්න:

let flattened = [...flatten([1,[2,[3,[4]]]])]; // [1, 2, 3, 4]

මම මේ ප්‍රවේශයට කැමතියි. Stackoverflow.com/a/35073573/1175496 ට සමාන නමුත් ...උත්පාදක යන්ත්රය හරහා නැවත ධාවනය කිරීමට පැතිරීමේ ක්‍රියාකරු භාවිතා කරයි .
රතු කව්පි

6

මම මුළු අරාවම නූලක් බවට පරිවර්තනය කරමි, නමුත් වෙනත් පිළිතුරු මෙන් නොව, අනවශ්‍ය ප්‍රති .ලයක් ලබා JSON.stringifyදෙන toString()ක්‍රමය භාවිතා කිරීම සහ භාවිතා නොකිරීම .

එම JSON.stringifyප්‍රතිදානය සමඟ ඉතිරිව ඇත්තේ සියලු වරහන් ඉවත් කිරීම, ප්‍රති result ලය ආරම්භක සහ අවසන් වරහන් සමඟ නැවත ඔතා, ප්‍රති JSON.parsestring ලය නැවත “ජීවයට” ගෙන ඒමයි.

  • කිසිදු වේග පිරිවැයකින් තොරව අනන්ත කැදැලි අරා හැසිරවිය හැකිය.
  • කොමාව අඩංගු නූල් වන අරා අයිතම නිවැරදිව හැසිරවිය හැකිය.

var arr = ["abc",[[[6]]],["3,4"],"2"];

var s = "[" + JSON.stringify(arr).replace(/\[|]/g,'') +"]";
var flattened = JSON.parse(s);

console.log(flattened)

  • බහුමානීය නූල් / අංක සඳහා පමණි (වස්තු නොවේ)

ඔබේ විසඳුම වැරදිය. එම ["345", "2", "3,4", "2"]එක් එක් අගයන් වෙනම
දර්ශකවලට

serealseanp - එම අරාව අයිතමයේ වටිනාකම ඔබ වරදවා වටහාගෙන ඇත. මම හිතාමතාම එම කොමාව වටිනාකමක් ලෙස තැබුවෙමි, අනෙක් සියල්ලටම වඩා මගේ විසඳුමේ බලය අවධාරණය කිරීම සඳහා අරේ පරිසීමක කොමාවක් ලෙස නොවේ "3,4".
vsync

1
මම වරදවා වටහා ගත්තා
pizzarob

එය නියත වශයෙන්ම මම මේ සඳහා දුටු වේගවත්ම විසඳුම බව පෙනේ; svsync හි කිසියම් අන්තරායන් ගැන ඔබ දන්නවාද (ඇත්ත වශයෙන්ම එය තරමක් අශෝභන ලෙස පෙනේ - කැදැලි අරා නූල් ලෙස සැලකීම: D)
ජෝර්ජ් කට්සානෝස්

E ජෝර්ජ් කැට්සානෝස් - මෙම ක්‍රමය ප්‍රාථමික වටිනාකමක් නැති අරා අයිතම (සහ කැදැලි අයිතම) සඳහා ක්‍රියා නොකරනු ඇත, උදාහරණයක් ලෙස DOM මූලද්‍රව්‍යයක් පෙන්වා දෙන අයිතමයක්
vsync

6

පැතිරීමේ ක්‍රියාකරු භාවිතා කිරීම:

const input = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"], ["$22"], ["$10"]];
const output = [].concat(...input);
console.log(output); // --> ["$6", "$12", "$25", "$25", "$18", "$22", "$10"]


5

එය අමාරු නැත, අරා හරහා නැවත ඒවා ඒකාබද්ධ කරන්න:

var result = [], input = [["$6"], ["$12"], ["$25"], ["$25"], ["$18"]];

for (var i = 0; i < input.length; ++i) {
    result = result.concat(input[i]);
}

5

මෙය පුනරාවර්තනය සඳහා රැකියාවක් සේ පෙනේ!

  • කැදැල්ලේ විවිධ මට්ටම් හසුරුවයි
  • හිස් අරා සහ අරා නොවන පරාමිතීන් හසුරුවයි
  • විකෘතියක් නොමැත
  • නවීන බ්‍රව්සර් විශේෂාංග මත රඳා නොපවතී

කේතය:

var flatten = function(toFlatten) {
  var isArray = Object.prototype.toString.call(toFlatten) === '[object Array]';

  if (isArray && toFlatten.length > 0) {
    var head = toFlatten[0];
    var tail = toFlatten.slice(1);

    return flatten(head).concat(flatten(tail));
  } else {
    return [].concat(toFlatten);
  }
};

භාවිතය:

flatten([1,[2,3],4,[[5,6],7]]);
// Result: [1, 2, 3, 4, 5, 6, 7] 

තත්පර 10 ක් සඳහා මගේ devTools පරිස්සමින්, flatten(new Array(15000).fill([1]))විසි Uncaught RangeError: Maximum call stack size exceededකර කැටි කර ඇත
pietrovismara

ietpietrovismara, මගේ පරීක්ෂණය 1s පමණ වේ.
අයිවන් යාන්

5

මම එය පුනරාවර්තනය සහ වසා දැමීම් භාවිතා කර ඇත

function flatten(arr) {

  var temp = [];

  function recursiveFlatten(arr) { 
    for(var i = 0; i < arr.length; i++) {
      if(Array.isArray(arr[i])) {
        recursiveFlatten(arr[i]);
      } else {
        temp.push(arr[i]);
      }
    }
  }
  recursiveFlatten(arr);
  return temp;
}

1
සරල හා මිහිරි, මෙම පිළිතුර පිළිගත් පිළිතුරට වඩා හොඳින් ක්‍රියා කරයි. එය පළමු මට්ටමට පමණක් නොව ගැඹුරින් කැදැලි මට්ටම් සමතලා කරයි
ඕම් ශංකර්

1
AFAIK එය ශබ්දකෝෂ විෂය
පථයක්

as ඩැෂම්බල්ස් නිවැරදියි - වෙනස වන්නේ එය වසා දැමීමක් නම් ඔබ අභ්‍යන්තර ශ්‍රිතය පිටතට ගෙන ඒම සහ පිටත ශ්‍රිතය අවසන් වූ විට එහි විෂය පථයට ප්‍රවේශ වීම සඳහා අභ්‍යන්තර ශ්‍රිතය භාවිතා කළ හැකිය. මෙහිදී බාහිර ශ්‍රිතයේ ආයු කාලය අභ්‍යන්තර ශ්‍රිතයට වඩා දිගු බැවින් “වසා දැමීමක්” කිසි විටෙකත් නිර්මාණය නොවේ.
මරේ

5

මම පසුගිය දින ඊඑස් 6 උත්පාදක යන්ත්රය සමඟ විකාරරූපී වෙමින් මෙම සාරාංශය ලිවීය . එහි අඩංගු ...

function flatten(arrayOfArrays=[]){
  function* flatgen() {
    for( let item of arrayOfArrays ) {
      if ( Array.isArray( item )) {
        yield* flatten(item)
      } else {
        yield item
      }
    }
  }

  return [...flatgen()];
}

var flatArray = flatten([[1, [4]],[2],[3]]);
console.log(flatArray);

මූලික වශයෙන් මම උත්පාදක යන්ත්‍රයක් නිර්මාණය කරන්නේ මුල් ආදාන අරාව හරහා ලූපයක් වන අතර, එය අරාවක් සොයා ගන්නේ නම් එය අභ්‍යන්තර අරා අඛණ්ඩව සමතලා කිරීම සඳහා පුනරාවර්තනය සමඟ ඒකාබද්ධව අස්වැන්න * ක්‍රියාකරු භාවිතා කරයි . අයිතමය අරාව නොවේ නම් එය තනි අයිතමය ලබා දෙයි . ඉන්පසු ES6 Spread operator (aka splat operator) භාවිතා කරමින් මම උත්පාදක යන්ත්රය නව අරා උදාහරණයකට සමතලා කරමි.

මම මෙහි ක්‍රියාකාරිත්වය පරීක්ෂා කර නැත, නමුත් එය ජනක යන්ත්‍ර සහ අස්වැන්න * ක්‍රියාකරු භාවිතා කිරීම සඳහා කදිම සරල උදාහරණයක් බව මම සිතමි.

නමුත් නැවතත්, මම ගොන් වැඩක් කළෙමි, එබැවින් මෙය කිරීමට තවත් ක්‍රියාකාරී ක්‍රම ඇති බව මට විශ්වාසයි.


1
සමාන පිළිතුරක් (උත්පාදක යන්ත්රය සහ අස්වැන්න නියෝජිත කණ්ඩායම භාවිතා කිරීම), නමුත් PHP ආකෘතියෙන්
රතු කව්පි

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.