องค์ประกอบอาร์เรย์สลับ Javascript


228

มีวิธีที่ง่ายกว่าในการสลับสององค์ประกอบในอาร์เรย์หรือไม่?

var a = list[x], b = list[y];
list[y] = a;
list[x] = b;

คำตอบ:


411

คุณต้องการเพียงหนึ่งตัวแปรชั่วคราว

var b = list[y];
list[y] = list[x];
list[x] = b;

แก้ไขการไฮแจ็คคำตอบยอดนิยม 10 ปีต่อมาด้วยการนำ ES6 มาใช้อย่างมากมายภายใต้สายรัดของเรา:

รับอาร์เรย์arr = [1,2,3,4]คุณสามารถสลับค่าในหนึ่งบรรทัดตอนนี้เช่น:

[arr[0], arr[1]] = [arr[1], arr[0]];

[2,1,3,4]นี้จะผลิตอาร์เรย์ นี่คือการกำหนด destructuring


2
แม้ว่าจะไม่มีการใช้ ECMAScript 6 Destructuring Assignment แต่ก็สามารถทำการสลับพร้อมกันได้โดยไม่ทำให้ขอบเขตปัจจุบันกับตัวแปรชั่วคราว: a = [b, b = a][0];ตามที่ @Jan ชี้ให้เห็นแม้ว่าฉันยังพบว่าตัวเองใช้วิธีการตัวแปรชั่วคราวเช่นข้ามภาษา (เช่น C / C ++ ) และวิธีการแรกที่มักจะปรากฏในใจของฉัน
Ultimater

3
คุณสามารถแลกเปลี่ยน (กลายพันธุ์) กับ es6 ตามที่คนอื่นแสดงด้านล่าง:[ list[y], list[x] ] = [ list[x], list[y] ];
protoEvangelion

[arr[0], arr[1]] = [arr[1], arr[0]]ผลิตเฉพาะ[2, 1]โดยไม่ต้องมีส่วนที่เหลือของอาร์เรย์
Yerko Palma

8
@YerkoPalma - นิพจน์ส่งคืน [2,1] แต่อาร์เรย์ดั้งเดิมจะกลายพันธุ์เป็น [2,1,3,4]
danbars

111

หากคุณต้องการนิพจน์เดียวใช้จาวาสคริปต์ดั้งเดิมโปรดจำไว้ว่าค่าส่งคืนจากการดำเนินการประกบกันมีองค์ประกอบที่ถูกลบออก

var A = [1, 2, 3, 4, 5, 6, 7, 8, 9], x= 0, y= 1;
A[x] = A.splice(y, 1, A[x])[0];
alert(A); // alerts "2,1,3,4,5,6,7,8,9"

แก้ไข:

[0]เป็นสิ่งจำเป็นในตอนท้ายของการแสดงออกเป็นArray.splice()ผลตอบแทนอาร์เรย์และในสถานการณ์เช่นนี้เราจำเป็นต้องมีองค์ประกอบเดียวในอาร์เรย์กลับ


3
splice ส่งคืนอาร์เรย์ ดังนั้นในตัวอย่างของคุณหลังจากการดำเนินการสลับอาร์เรย์อาร์เรย์ของคุณมีลักษณะ: [[2], 1, 3, 4, 5, 6, 7, 8, 9]
JPot

1
A [x] = A.splice (y, 1, A [x]) [0]; ? ใน mootools Array.implement ({swap: function (x, y) {this [y] = this.splice (x, 1, [y]) นี้ [0];}});
เคน

ยืนยันว่า [0] หายไป
โยฮันน์ฟิลิปป์ Strathausen

ดีและสั้น แต่อย่างที่ @aelgoa กล่าวว่าการสลับอย่างง่ายนั้นเกือบจะช้า
ofir_aghai

75

ดูเหมือนว่าจะโอเค ....

var b = list[y];
list[y] = list[x];
list[x] = b;

ใช้ Howerver

var b = list[y];

หมายความว่าตัวแปรbจะมีอยู่ในส่วนที่เหลือของขอบเขต สิ่งนี้อาจนำไปสู่การรั่วไหลของหน่วยความจำ ไม่น่าจะ แต่ก็ยังดีกว่าที่จะหลีกเลี่ยง

อาจเป็นความคิดที่ดีที่จะใส่สิ่งนี้ลงใน Array.prototype.swap

Array.prototype.swap = function (x,y) {
  var b = this[x];
  this[x] = this[y];
  this[y] = b;
  return this;
}

ซึ่งสามารถเรียกเช่น:

list.swap( x, y )

นี้เป็นวิธีการทำความสะอาดทั้งหลีกเลี่ยงการรั่วไหลของหน่วยความจำและแห้ง


ฉันชอบสิ่งนี้เช่นกัน Array.implement ({swap: function (x, y) {x = this [x]; this [x] = this [y]; this [y] = x; return this;}});
เคน

1
นี่เป็นสิ่งที่ดี อาจจะมีการตรวจสอบขอบเขต? Array.prototype.swap = function (x,y) { if (x >= 0 && x < this.length && y >= 0 && y < this.length) { var b = this[x]; this[x] = this[y]; this[y] = b; } return this; };
David R.

@DavidR การตรวจสอบขอบเขตเกินความจำเป็นและไม่จำเป็น ผู้เรียกมีทุกสิ่งที่จำเป็นในการดำเนินการตรวจสอบดังกล่าวหากต้องการ แต่ในกรณีส่วนใหญ่คุณรู้แล้วว่า x และ y อยู่ในขอบเขตเพราะคุณอยู่ในวงวนของการเรียงลำดับบางอย่าง
Neil

6
คุณไม่สามารถหลีกเลี่ยง "การรั่วไหลของหน่วยความจำที่อาจเกิดขึ้น" โดยการหุ้มมันไว้ในฟังก์ชั่นหรือไม่?
Carcigenicate

3
เพื่อหลีกเลี่ยงอุบัติเหตุ "แบน" ที่อาจเกิดขึ้นฉันจะไม่แตะต้องต้นแบบลูกโซ่ทุกประเภทในตัว
AaronDancer

54

จากการสุ่มของเมตาฟิลเทอร์บางคน "จาวาสคริปต์เวอร์ชันล่าสุดอนุญาตให้คุณทำการแลกเปลี่ยน (เหนือสิ่งอื่นใด) ได้อย่างเรียบร้อยยิ่งขึ้น:"

[ list[x], list[y] ] = [ list[y], list[x] ];

การทดสอบอย่างรวดเร็วของฉันแสดงให้เห็นว่ารหัส Pythonicนี้ใช้งานได้ดีในเวอร์ชันของ JavaScript ที่ใช้ในปัจจุบัน "สคริปต์ Google Apps" (".gs") อนิจจาการทดสอบเพิ่มเติมแสดงรหัสนี้ให้ "Uncaught ReferenceError: ไม่ถูกต้องด้านซ้ายมือในการกำหนด" Google Chrome เวอร์ชันใดก็ตามที่ใช้ JavaScript (".js") 24.0.1312.57 m


2
นี่เป็นส่วนหนึ่งของข้อเสนอ ES6: ยังไม่เป็นทางการดังนั้นจึงไม่ควรคาดเดาว่าจะทำงานได้ทุกที่
Isiah Meadows

2
มันทำงานได้ใน firefox รุ่นล่าสุดในปัจจุบัน (39.0.3)
เจมี่

2
ใช้งานได้ใน Chrome เวอร์ชัน 54.0.2840.71 และรุ่นก่อนหน้า นอกจากนี้ควรจะเป็นของคุณได้ให้รหัสถ้าคุณใช้ transpiler ES6 เช่นBabel
amoebe

3
รักทางออกนี้ สะอาดตามที่ตั้งใจไว้ น่าเสียดายที่คำถามถูกถามเมื่อ 9 ปีที่แล้ว ...
DavidsKanal

2
มันได้รับการมาตรฐานใน es6 และคุณลักษณะนี้เรียกว่าการทำลายล้าง
AL-zami

29

คุณไม่จำเป็นต้องบัฟเฟอร์ทั้งสองค่า - เพียงค่าเดียว:

var tmp = list[x];
list[x] = list[y];
list[y] = tmp;

13
'tmp' ของคุณฟังดูสมเหตุสมผลกว่าที่จะใช้ 'b' แล้ว
mtasic85

@ofir_aghai ใช่คุณพูดถูก: 10+ ปีที่แล้วมีคำตอบอีก22 วินาทีก่อนหน้านี้ (12: 14: 16Z เทียบกับ 12: 14: 38Z) ...
Marc Gravell

ในวันปกติฉันติดมัน แต่เพียงเพราะปัญหาวินาทีและการเคารพต่อ 10 ปีของคุณกลับมาที่นี่ ;-)
ofir_aghai

ขออภัยไม่ให้ฉันเปลี่ยนการลงคะแนน .. "ตอนนี้การลงคะแนนของคุณถูกล็อคเว้นแต่จะมีการแก้ไขคำตอบนี้"
ofir_aghai

22

คุณสามารถสลับองค์ประกอบในอาร์เรย์ด้วยวิธีต่อไปนี้:

list[x] = [list[y],list[y]=list[x]][0]

ดูตัวอย่างต่อไปนี้:

list = [1,2,3,4,5]
list[1] = [list[3],list[3]=list[1]][0]
//list is now [1,4,3,2,5]

หมายเหตุ: มันทำงานในลักษณะเดียวกันกับตัวแปรปกติ

var a=1,b=5;
a = [b,b=a][0]

6
นี่คือยอดเยี่ยมคล้ายกับวิธีที่ถูกต้องมาตรฐานในการทำเช่นนี้ใน ES6 [list[x], list[y]] = [list[y], list[x]];(รุ่นถัดไปของจาวาสคริปต์):
Isiah Meadows

1
นี่ไม่มีอะไรที่จะทำเราแลกเปลี่ยน ES6 array โดยการปรับโครงสร้าง นี่เป็นเพียงการใช้เวิร์กโฟลว์ JS อย่างชาญฉลาด รูปแบบการสลับที่สวยงามหากคุณใช้การเข้ารหัสแบบอินไลน์บ่อยครั้งเช่นthis[0] > this[1] && (this[0] = [this[1],this[1]=this[0]][0]);
Redu

18

ด้วยค่าตัวเลขคุณสามารถหลีกเลี่ยงตัวแปรชั่วคราวได้โดยใช้ bitwise xor

list[x] = list[x] ^ list[y];
list[y] = list[y] ^ list[x];
list[x] = list[x] ^ list[y];

หรือผลรวมเลขคณิต (การสังเกตว่าวิธีนี้ใช้ได้เฉพาะเมื่อ x + y น้อยกว่าค่าสูงสุดสำหรับประเภทข้อมูล)

list[x] = list[x] + list[y];
list[y] = list[x] - list[y];
list[x] = list[x] - list[y];

2
นั่นเป็นสิ่งที่น่ากลัวเหมือนเวเดอร์หรือไม่? +1
krosenvold

7
บางสิ่งบางอย่างที่ไม่ถูกต้อง. ไม่list[y] = list[x] - list[x];เพียงถือเอาlist[y] = 0;ใช่หรือไม่
ErikE

3
เคล็ดลับ xor ก็ล้มเหลวเมื่อ x = y - มันตั้ง list [x] เป็นศูนย์เมื่อคุณอาจคาดหวังว่ามันจะเก็บ list [x] ค่าเดิม
เดวิดแครี

1
ในทางเทคนิคคุณสร้างค่าอุณหภูมิคุณเพียงแค่ไม่ย้ายออกไปนอกพื้นที่ที่เกี่ยวข้องของอาร์เรย์
Mark Smit

1
ไม่เรียบง่ายไม่มีประสิทธิภาพมากขึ้น
LoganMzz

17

สิ่งนี้ไม่มีอยู่เมื่อมีการถามคำถาม แต่ ES2015 แนะนำการทำลายอาร์เรย์ซึ่งช่วยให้คุณสามารถเขียนได้ดังนี้:

let a = 1, b = 2;
// a: 1, b: 2
[a, b] = [b, a];
// a: 2, b: 1

14
หากต้องการสลับเช่นนี้ภายในอาร์เรย์:[list[x], list[y]] = [list[y], list[x]];
Stromata

15

เพื่อสลับสององค์ประกอบต่อเนื่องของอาร์เรย์

array.splice(IndexToSwap,2,array[IndexToSwap+1],array[IndexToSwap]);

13

สรุปโดยย่อจากhttp://www.greywyvern.com/?post=265

var a = 5, b = 9;    
b = (a += b -= a) - b;    
alert([a, b]); // alerts "9, 5"

1
ถ้าคุณหุ้มมันไว้ในswap(a, b)ฟังก์ชั่นคุณไม่จำเป็นต้องกังวลเกี่ยวกับความสามารถในการอ่าน
AccidentalTaylorExpansion

1
ใช้งานได้เฉพาะสำหรับจำนวนเต็ม
ลด

สิ่งนี้อาจปรับให้เหมาะสมไม่ดี เรียบเรียงอาจตรวจพบว่าเป็น "สำนวน Swap" แต่ไม่สามารถตรวจสอบผลกระทบเว้นแต่จะสามารถมั่นใจได้ว่าทั้งสองชนิดมี ints และยังว่าพวกเขาไม่ได้นามแฝง
mwfearnley


9

พิจารณาโซลูชันดังกล่าวโดยไม่จำเป็นต้องกำหนดตัวแปรที่สาม:

function swap(arr, from, to) {
  arr.splice(from, 1, arr.splice(to, 1, arr[from])[0]);
}

var letters = ["a", "b", "c", "d", "e", "f"];

swap(letters, 1, 4);

console.log(letters); // ["a", "e", "c", "d", "b", "f"]

หมายเหตุ: คุณอาจต้องการเพิ่มการตรวจสอบเพิ่มเติมเช่นความยาวของอาร์เรย์ โซลูชันนี้ไม่แน่นอนดังนั้นswapฟังก์ชั่นไม่จำเป็นต้องส่งคืนอาเรย์ใหม่มันแค่ทำการเปลี่ยนรูปไปที่อาเรย์ที่ถูกส่งเข้ามา


นอกจากนี้ยังสามารถใช้โอเปอเรเตอร์การแพร่กระจายได้:arr.splice(from, 1, arr.splice(to, 1, ...arr[from]))
Orkun Tuzel

7

คุณสามารถสลับวัตถุหรือตัวอักษรจำนวนเท่าใดก็ได้แม้จะเป็นชนิดต่าง ๆ โดยใช้ฟังก์ชั่นระบุตัวตนแบบง่าย ๆ ดังนี้:

var swap = function (x){return x};
b = swap(a, a=b);
c = swap(a, a=b, b=c);

สำหรับปัญหาของคุณ:

var swap = function (x){return x};
list[y]  = swap(list[x], list[x]=list[y]);

สิ่งนี้ใช้ได้ใน JavaScript เพราะยอมรับข้อโต้แย้งเพิ่มเติมแม้ว่าจะไม่ได้ประกาศหรือใช้ก็ตาม การมอบหมายa=bฯลฯ เกิดขึ้นหลังจากaถูกส่งผ่านเข้าไปในฟังก์ชัน


hackish ... list[y] = (function(x){return x})(list[x],list[x]=list[y]);แต่คุณสามารถทำอย่างใดอย่างหนึ่งที่ดีกว่าถ้าคุณเป็นเพียงการใช้ฟังก์ชั่นเมื่อ: หรือถ้าคุณสนใจใน ES6 (รุ่นถัดไปของ JS) [list[x], list[y]] = [list[y], list[x]ก็เมามันง่าย: ฉันดีใจที่พวกเขาเพิ่มการทำงานและการใช้งานคลาสเพิ่มเติมลงใน JavaScript เวอร์ชันถัดไป
Isiah Meadows

6

สำหรับองค์ประกอบสองรายการขึ้นไป (หมายเลขคงที่)

[list[y], list[x]] = [list[x], list[y]];

ไม่ต้องใช้ตัวแปรชั่วคราว!

list.reverse()ฉันคิดเกี่ยวกับเพียงแค่โทร แต่แล้วฉันรู้ว่ามันจะทำงานตามที่แลกเปลี่ยนเฉพาะเมื่อ
list.length = x + y + 1

สำหรับจำนวนตัวแปรขององค์ประกอบ

ฉันได้ดูโครงสร้าง Javascript ที่ทันสมัยหลายอย่างเกี่ยวกับเอฟเฟกต์นี้รวมถึงแผนที่และแผนที่แต่น่าเสียดายที่ไม่มีใครทำโค้ดที่กะทัดรัดหรือเร็วกว่าโครงสร้างแบบลูปที่ล้าสมัยนี้:

function multiswap(arr,i0,i1) {/* argument immutable if string */
    if (arr.split) return multiswap(arr.split(""), i0, i1).join("");
    var diff = [];
    for (let i in i0) diff[i0[i]] = arr[i1[i]];
    return Object.assign(arr,diff);
}

Example:
    var alphabet = "abcdefghijklmnopqrstuvwxyz";
    var [x,y,z] = [14,6,15];
    var output = document.getElementsByTagName("code");
    output[0].innerHTML = alphabet;
    output[1].innerHTML = multiswap(alphabet, [0,25], [25,0]);
    output[2].innerHTML = multiswap(alphabet, [0,25,z,1,y,x], [25,0,x,y,z,3]);
<table>
    <tr><td>Input:</td>                        <td><code></code></td></tr>
    <tr><td>Swap two elements:</td>            <td><code></code></td></tr>
    <tr><td>Swap multiple elements:&nbsp;</td> <td><code></code></td></tr>
</table>


5

มีวิธีหนึ่งที่น่าสนใจในการแลกเปลี่ยน:

var a = 1;
var b = 2;
[a,b] = [b,a];

(วิธี ES6)


5
สำหรับอาร์เรย์มันมีมากขึ้นvar a= [7,8,9,10], i=2, j=3;[a[i],a[j]] = [a[j],a[i]];
caub


3

นี่คือสายการบินหนึ่งที่ไม่ได้กลายพันธุ์list:

let newList = Object.assign([], list, {[x]: list[y], [y]: list[x]})

(ใช้คุณสมบัติภาษาไม่พร้อมใช้งานในปี 2009 เมื่อมีการโพสต์คำถาม!)


1

ต่อไปนี้เป็นค่าเวอร์ชั่นสลับขนาดกะทัดรัดที่ i1 กับ i2 ใน arr

arr.slice(0,i1).concat(arr[i2],arr.slice(i1+1,i2),arr[i1],arr.slice(i2+1))

ที่มีประสิทธิภาพน้อยกว่านั้นวิธีการตัวแปรชั่วคราว คุณกำลังส่งคืนอาเรย์ที่ถูกปรับแต่งซึ่งถูกแบ่งเป็นสามครั้งอย่างมีประสิทธิภาพและต่อกันเข้าด้วยกันกับวัตถุสองชิ้นระหว่างสามอาร์เรย์ที่ถูกแบ่งย่อย คุณต้องใช้หน่วยความจำมากกว่าสองเท่าอย่างมีประสิทธิภาพเกินกว่าที่จำเป็นเพื่อให้ได้ค่าเพื่อเพียงกำหนดให้กับอาร์เรย์ (ไม่มีสิ่งใดเกิดขึ้น)
Isiah Meadows

1

นี่คือรูปแบบที่ตรวจสอบก่อนว่าดัชนีมีอยู่ในอาร์เรย์หรือไม่:

Array.prototype.swapItems = function(a, b){
    if(  !(a in this) || !(b in this) )
        return this;
    this[a] = this.splice(b, 1, this[a])[0];
    return this;
}

ปัจจุบันมันจะกลับมาthisหากไม่มีดัชนี แต่คุณสามารถปรับเปลี่ยนพฤติกรรมที่ล้มเหลวได้อย่างง่ายดาย


1

สลับองค์ประกอบแรกและสุดท้ายในอาร์เรย์โดยไม่มีตัวแปรชั่วคราวหรือวิธีการแลกเปลี่ยน ES6 [a, b] = [b, a]

[a.pop(), ...a.slice(1), a.shift()]


1

โซลูชั่น typescript ที่โคลนอาร์เรย์แทนการกลายพันธุ์ที่มีอยู่

export function swapItemsInArray<T>(items: T[], indexA: number, indexB: number): T[] {
  const itemA = items[indexA];

  const clone = [...items];

  clone[indexA] = clone[indexB];
  clone[indexB] = itemA;

  return clone;
}

0

เพียงเพื่อความสนุกของมันวิธีอื่นโดยไม่ใช้ตัวแปรพิเศษใด ๆ จะเป็น:

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

// swap index 0 and 2
arr[arr.length] = arr[0];   // copy idx1 to the end of the array
arr[0] = arr[2];            // copy idx2 to idx1
arr[2] = arr[arr.length-1]; // copy idx1 to idx2
arr.length--;               // remove idx1 (was added to the end of the array)


console.log( arr ); // -> [3, 2, 1, 4, 5, 6, 7, 8, 9]


0

เพื่อความสั้นกระชับนี่เป็นเวอร์ชั่นซับน่าเกลียดที่มีความน่าเกลียดน้อยกว่า concat และการกรีดด้านบนเล็กน้อย คำตอบที่ได้รับการยอมรับเป็นวิธีที่จะไปอย่างแท้จริงและสามารถอ่านได้มากขึ้น

ได้รับ:

var foo = [ 0, 1, 2, 3, 4, 5, 6 ];

หากคุณต้องการสลับค่าของสองดัชนี (a และ b); แล้วสิ่งนี้จะทำ:

foo.splice( a, 1, foo.splice(b,1,foo[a])[0] );

ตัวอย่างเช่นหากคุณต้องการสลับ 3 และ 5 คุณสามารถทำได้ด้วยวิธีนี้:

foo.splice( 3, 1, foo.splice(5,1,foo[3])[0] );

หรือ

foo.splice( 5, 1, foo.splice(3,1,foo[5])[0] );

ทั้งคู่ให้ผลลัพธ์เหมือนกัน:

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

#splicehatersarepunks :)


0

หากคุณไม่ต้องการใช้ตัวแปร temp ใน ES5 นี่เป็นวิธีหนึ่งในการสลับองค์ประกอบอาร์เรย์

var swapArrayElements = function (a, x, y) {
  if (a.length === 1) return a;
  a.splice(y, 1, a.splice(x, 1, a[y])[0]);
  return a;
};

swapArrayElements([1, 2, 3, 4, 5], 1, 3); //=> [ 1, 4, 3, 2, 5 ]

ด้วยวิธีนี้แทนที่จะสร้างตัวแปร temp คุณกำลังสร้างอาร์เรย์ใหม่ 2 อันเนื่องจากa.spliceส่งคืนอาร์เรย์ที่มีองค์ประกอบที่ถูกลบ developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
XCS

มีวิธีใดบ้างที่เราจะทำได้ดีกว่านี้? @Cristy
venkat7668

คำตอบที่ยอมรับจะตรงไปข้างหน้าหนึ่ง สิ่งนี้จะเป็นประโยชน์เมื่อคุณมีข้อ จำกัด เกี่ยวกับจำนวนของการประกาศตัวแปร (ส่วนใหญ่เป็นการสัมภาษณ์ :)) แต่ไม่มีประสิทธิภาพหน่วยความจำตามที่คุณกล่าวถึง @Cristy
venkat7668

โดยส่วนตัวฉันคิดว่ามันเป็นการปฏิบัติที่ไม่ดีและไม่ควรแนะนำให้กับผู้เริ่มต้น มันอ่านยากมาก
XCS

0

ลองฟังก์ชั่นนี้ ...

$(document).ready(function () {
        var pair = [];
        var destinationarray = ['AAA','BBB','CCC'];

        var cityItems = getCityList(destinationarray);
        for (var i = 0; i < cityItems.length; i++) {
            pair = [];
            var ending_point = "";
            for (var j = 0; j < cityItems[i].length; j++) {
                pair.push(cityItems[i][j]);
            }
            alert(pair);
            console.log(pair)
        }

    });
    function getCityList(inputArray) {
        var Util = function () {
        };

        Util.getPermuts = function (array, start, output) {
            if (start >= array.length) {
                var arr = array.slice(0);
                output.push(arr);
            } else {
                var i;

                for (i = start; i < array.length; ++i) {
                    Util.swap(array, start, i);
                    Util.getPermuts(array, start + 1, output);
                    Util.swap(array, start, i);
                }
            }
        }

        Util.getAllPossiblePermuts = function (array, output) {
            Util.getPermuts(array, 0, output);
        }

        Util.swap = function (array, from, to) {
            var tmp = array[from];
            array[from] = array[to];
            array[to] = tmp;
        }
        var output = [];
        Util.getAllPossiblePermuts(inputArray, output);
        return output;
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


0

var arr = [1, 2];
arr.splice(0, 2, arr[1], arr[0]);
console.log(arr); //[2, 1]


1
ในขณะที่ข้อมูลโค้ดนี้อาจแก้ปัญหาได้รวมถึงคำอธิบายช่วยปรับปรุงคุณภาพของโพสต์ของคุณ จำไว้ว่าคุณกำลังตอบคำถามสำหรับผู้อ่านในอนาคตและคนเหล่านั้นอาจไม่ทราบสาเหตุของการแนะนำรหัสของคุณ
Alessio

-1

การใช้ES6เป็นไปได้ที่จะทำเช่นนี้ ...

ลองนึกภาพคุณมี2 อาร์เรย์เหล่านี้...

const a = ["a", "b", "c", "d", "e"];
const b = [5, 4, 3, 2, 1];

และคุณต้องการสลับค่าแรก:

const [a0] = a;
a[0] = b[0];
b[0] = a0;

และความคุ้มค่า:

a; //[5, "b", "c", "d", "e"]
b; //["a", 4, 3, 2, 1]

-2
Array.prototype.swap = function(a, b) {
  var temp = this[a];
  this[a] = this[b];
  this[b] = temp;
};

การใช้งาน:

var myArray = [0,1,2,3,4...];
myArray.swap(4,1);

1
ไม่จำเป็นต้องหยาบคาย นอกจากนี้การขยายArrayต้นแบบไม่ได้เป็นส่วนหนึ่งของสิ่งที่ขอ - มันอาจสร้างความสับสนได้มากกว่าสิ่งที่ดี
Mathias Lykkegaard Lorenzen

เป็นการแสดงให้เห็นอย่างไรว่าคำตอบบางคำนั้นบ้าและการขยายอาเรย์ต้นแบบจะเป็นอย่างไรและการเพิ่มผลตอบแทนนี้จะทำให้โซ่สามารถ ...
user2472643

2
คุณกำลังแสดงว่า "วิธีที่ถูกต้อง" อาจทำให้เกิดความรู้สึกผิด แต่ฉันขอแนะนำให้พูดถึงสิ่งที่คุณกำลังทำ (ขยายต้นแบบ) และวิธีการที่มีประโยชน์ตรงตามที่คุณเพิ่งอธิบายให้ฉัน
Mathias Lykkegaard Lorenzen

1
gotcha ขอโทษที่ชั่งของฉันไม่ได้อยู่ในบางครั้ง ^ _ ^
user2472643

2
คุณเป็นคนเดียวที่อธิบายปัญหาเกี่ยวกับบริบทของคำตอบ ... อันดับแรกคะแนนเชิงลบควรถูกสงวนไว้สำหรับคำตอบที่ไม่ทำงาน ข้อสองนี่คือคำตอบที่ดีพร้อมกับการใช้งานที่สง่างามที่ไม่ทำให้เกิดความขัดแย้ง ตัดสินรหัสไม่ใช่การส่งมอบ นอกจากนี้ในคำตอบของฉันถ้าคุณถอดมันออกและแยกส่วนขยายต้นแบบมันจะกลายเป็นคำตอบเดียวกับคำตอบที่โหวตมากที่สุดดังนั้นความจริงที่ว่านี่คือ -6 แสดงถึงการขาดความคิดจากคนที่ลงคะแนน และถูกโพสต์หลายเดือนก่อนคำตอบยอดนิยม ... ดังนั้นนี่จึงเป็นความนิยมไม่ใช่การประกวดรหัส
user2472643

-3

หากต้องการสลับองค์ประกอบแรกและสุดท้ายเท่านั้น:

array.unshift( array.pop() );

รหัสนี้มีข้อบกพร่อง มันต้องใช้องค์ประกอบสุดท้ายของอาร์เรย์จากนั้นวางไว้ที่จุดเริ่มต้นนั่นไม่ใช่การแลกเปลี่ยน รหัสนี้ไม่นี้: แทน[1, 2, 3] => [3, 1, 2] [1, 2, 3] => [3, 2, 1]
David Archibald
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.