ลบรายการสุดท้ายออกจากอาร์เรย์


441

ฉันมีอาเรย์ต่อไปนี้

var arr = [1,0,2];

ฉันต้องการลบองค์ประกอบสุดท้ายเช่น 2

ฉันใช้arr.slice(-1);แต่ไม่ได้ลบค่า




3
arr.splice (-1,1) จะกลับมาหาคุณอาร์เรย์ [1,0]; arr.slice (-1,1) จะกลับมาหาคุณ [2]
Anja Ishmukhametova

10
arr.slice(0,-1)เป็นทางออกที่ดีที่สุดสำหรับฉัน
Black Mamba

3
คำถามนี้ค่อนข้างคลุมเครือเนื่องจาก "ลบองค์ประกอบสุดท้าย" อาจหมายถึงลบองค์ประกอบออกจากอาร์เรย์และเก็บอาร์เรย์ไว้ (โดยที่มีองค์ประกอบน้อยกว่าหนึ่ง) แต่มันอาจหมายถึงการลบองค์ประกอบและเก็บองค์ประกอบ กรณีแรก: splice()กรณีที่สอง: pop().
thoni56

คำตอบ:


517

1
@PrithvirajMitra คุณต้องการลบ 1 และ 0 หรือไม่ ดังนั้นอาร์เรย์ == [2]?
Anton

3
ใช้งานไม่ได้กับอาร์เรย์แบบองค์ประกอบเดียว: [1].splice(-1, 1)=>[1]
Tvaroh

135
นี่ไม่ใช่ทางออกที่ดีที่สุดที่สุดคือฟังก์ชั่นป๊อป ไม่ใช่อย่างนี้
Tommix

6
ป๊อปด้วยตัวเองจะคืนค่าขององค์ประกอบสุดท้ายเท่านั้น ถ้าผมเข้าใจอย่างถูกต้อง @PrithvirajMitra ต้องการสิ่งที่สอง: 1) ในการลบองค์ประกอบสุดท้ายจากอาร์เรย์เดิมและ 2) กลับองค์ประกอบที่เป็น array องค์ประกอบหนึ่ง - คือ: ทิ้งไว้ข้างหลัง[0,1,2] -> [2] [0,1]หากเป็นกรณีนั้น[arr.pop()]จะทำเคล็ดลับ
เบ็นฮัลล์

11
โปรดทราบว่าarray.pop()จะเปลี่ยนการแก้ไขarrayในขณะที่slice(0, -1)จะไม่ ป๊อปเร็วกว่าแน่นอน แต่อาจไม่เหมาะกับทุกความต้องการ
adelriosantiago

621

Array.prototype.pop ()ตามระเบียบของ JavaScript

let fruit = ['apple', 'orange', 'banana', 'tomato'];
let popped = fruit.pop();

console.log(popped); // "tomato"
console.log(fruit); // ["apple", "orange", "banana"]

7
Array.prototype.pop () ดูเหมือนจะเป็นjsperf.com/slice-vs-splice-vs-pop/3 ที่
Daniel

1
เมื่อใช้ pop () ต้องแน่ใจว่าจะไม่ทำ jQuery ('# foo'). val (numbers.pop ()) เว้นแต่ว่าคุณต้องการวางไอเท็มสุดท้ายของอาร์เรย์ลงในฟิลด์ pop () ส่งคืนองค์ประกอบที่ถูกลบ อย่างที่สจ๊วตทำมาก่อนให้ทำอันดับ. pop (); และจากนั้นทำ jQuery ('# foo'). val (numbers) ...
Charles Robertson

4
ทางออกที่ดีที่สุด +1
mdlars

2
มันจะเจ๋งถ้ามี unpop () ที่คืนค่าอาเรย์ที่เหลือ
eomeroff

2
มีวิธีใดในการทำเช่นนี้ในขณะที่รักษาอาร์เรย์ไม่เปลี่ยนรูป?
nayiaw

263

คุณสามารถทำได้โดยใช้.slice()วิธีการเช่น:

arr.slice(0, -1);    // returns [1,0]

นี่คือตัวอย่าง:

var arr = [1, 0, 2];
var newArr = arr.slice(0, -1);    // returns [1,0]

console.log(newArr);
$('#div1').text('[' + arr + ']');
$('#div2').text('[' + newArr + ']');
<script src="http://code.jquery.com/jquery.min.js"></script>
<b>Original Array    : </b>
<div id="div1"></div>
<br/>
<b>After slice(0, -1): </b>
<div id="div2"></div>

แทนที่จะทำ:

arr.slice(-1);   // returns [2]

นี่คือตัวอย่าง:

var arr = [1, 0, 2];
var newArr = arr.slice(-1);    // returns [2]

console.log(newArr);
$('#div1').text('[' + arr + ']');
$('#div2').text('[' + newArr + ']');
<script src="http://code.jquery.com/jquery.min.js"></script>
<b>Original Array    : </b>
<div id="div1"></div>
<br/>
<b>After slice(-1): </b>
<div id="div2"></div>

คำอธิบาย: -

ตอนนี้ไวยากรณ์พื้นฐานของArray.prototype.slice()หรือในslice()วิธีการสั้น ๆคือ:

arr.slice([begin[, end]])

ที่นี่

beginพารามิเตอร์ดัชนีที่สกัด zero-based จากอาร์เรย์เริ่มต้น ดังนั้นให้พูดตามตัวอย่างข้างต้นถ้าเราทำอะไรเช่น

arr.slice(0)    // returns [1,0,2]

มันจะกลับมาทุกองค์ประกอบอาร์เรย์จากจุดเริ่มต้นของลำดับจากตำแหน่ง 0 [1,0,2]และนั่นคือ ในทำนองเดียวกันถ้าเราทำ

arr.slice(1)    // returns [0,2]

มันจะกลับมา[0,2]ตั้งแต่ 0 อยู่ที่ตำแหน่ง 1 ตรงนี้และทุกอย่างหลังจากนั้น ตอนนี้ในกรณีของคุณคุณได้ผ่านดัชนีลบเช่น-1เป็นพารามิเตอร์เริ่มต้นซึ่งบ่งชี้การชดเชยจากจุดสิ้นสุดของลำดับ ดังนั้นslice(-1)ในกรณีของคุณแยกองค์ประกอบอาร์เรย์หนึ่งสุดท้ายในลำดับและนั่นคือ2( ตามที่เราได้เห็นแล้วในการสาธิตข้างต้น )

ทีนี้มาพูดถึงendพารามิเตอร์ในslice()ไวยากรณ์เมธอดที่นี่ เป็นดัชนีที่ไม่มีการแยกจากอาเรย์สิ้นสุดอีกครั้ง ดังนั้นสมมติว่าเรามีอาร์เรย์ดังนี้: -

var arr = [1, 0, 2, 5, 3, 9];

และเราต้องการที่จะได้รับเพียง2,5,3องค์ประกอบในอาร์เรย์ ตอนนี้ตำแหน่งของ2จากจุดเริ่มต้นของลำดับ2และองค์ประกอบสุดท้ายมันเป็น3 4เราจะต้องยุติการสกัดที่ตำแหน่ง 5 ตามที่เราต้องการเพื่อให้ได้องค์ประกอบก่อนตำแหน่งนั้น ดังนั้นเราจะใช้slice()วิธีการที่นี่เช่น

arr.slice(2, 5)    // returns [2,5,3]

ในกรณีของคุณเราได้ใช้-1เป็นพารามิเตอร์สิ้นสุดดังนั้นโค้ดของเราจึงเป็นเช่นนั้น

arr.slice(0, -1)   // returns [1,0]

ในฐานะที่เป็นดัชนีเชิงลบendหมายถึงการชดเชยจากจุดสิ้นสุดของลำดับ ดังนั้นslice(0,-1)แยกองค์ประกอบแรกผ่านองค์ประกอบที่สองถึงครั้งสุดท้ายในลำดับ ดังนั้นเราจะได้ผลลัพธ์ที่ต้องการ เราสามารถทำได้เช่นกัน

arr.slice(0, 2)    // returns [1,0]

เราจะได้ผลลัพธ์เดียวกัน แต่ฉันได้ใช้-1ที่นี่เพราะมันง่ายกว่าที่จะติดตั้งแม้จะเป็นแถวยาว ๆ

[0,2,3,1,2,9,3,6,3,9,1,0,2,9,0,1,1,2,3,4,7,9,1]

ถ้าคุณเพียงต้องการที่จะลบองค์ประกอบสุดท้ายที่คุณไม่ต้องการที่จะนั่งและคำนวณตำแหน่งสุดท้ายของ 9 arr.slice(0, 22)ที่นี่และทำเช่นเดียวกับ จากนั้นคุณสามารถใช้ตรรกะดัชนีเชิงลบได้ที่นี่ & ทำ

arr.slice(0, -1) // same result as arr.slice(0, 22)

หวังว่ามันจะช่วย!


11
นี้ทำงานได้ดีเพียงให้แน่ใจว่าคุณสังเกตเห็นว่านี่คือการเรียกร้องให้ .slice () และจะไม่ .S พีเหา ()
Brian Hasden

4
ควรสังเกตว่าโซลูชันนี้ไม่ได้ลบรายการสุดท้ายออกจากอาร์เรย์arrแต่จะส่งคืนอาร์เรย์ใหม่ซึ่งไม่รวมรายการสุดท้ายนั้น ดังที่เอกสารของ Mozilla บอกว่า: "วิธี slice () จะส่งคืนสำเนาตื้น ๆ ของส่วนหนึ่งของอาร์เรย์ไปยังวัตถุอาร์เรย์ใหม่"
F Lekschas

4
โค้ดตัวอย่างของคำถามโดยปริยายถามว่าจะรับอาเรย์ใหม่ด้วยค่าสุดท้ายที่ถูกลบออกจากอาเรย์ดั้งเดิมได้อย่างไร ดังนั้นarr.slice(0, -1)คำตอบที่ดีที่สุดคือ
Tsounabe

4
ชิ้นจะดีกว่าเพราะมันไม่ได้แก้ไขอาร์เรย์เดิม
user365314

66

เรียนรู้จากตัวอย่าง:

let array_1 = [1,2,3,4];
let array_2 = [1,2,3,4];
let array_3 = [1,2,3,4];

array_1.splice(-1,1)  // output --> [4]      array_1 = [1,2,3]
array_2.slice(0,-1);  // output --> [1,2,3]  array_2 = [1,2,3,4]
array_3.pop();        // output --> 4        array_3 = [1,2,3]

13
นี่ควรเป็นคำตอบที่ยอมรับเพราะมันแสดงให้เห็นว่าอะไรผิดพลาดมากที่สุด > การคืนค่าอาร์เรย์ที่คุณต้องการหรือการกลายพันธุ์อาร์เรย์ในแบบที่คุณต้องการ
RaisingAgent

1
@RaisingAgent ขอบคุณสำหรับการสังเกตสิ่งเหล่านี้ :)
Lukas Liesis

43

คุณจะต้องทำเช่นนี้เนื่องจากsliceจะไม่เปลี่ยนอาเรย์ดั้งเดิม

arr = arr.slice(-1);

หากคุณต้องการเปลี่ยนอาเรย์ดั้งเดิมคุณสามารถใช้splice:

arr.splice(-1, 1);

หรือpop:

arr.pop();

22

ฉันคิดว่า.pop()เป็นคำตอบที่ถูกต้องที่สุดอย่างไรก็ตามบางครั้งมันอาจไม่ทำงานเนื่องจากคุณต้องใช้อาร์เรย์โดยไม่มีองค์ประกอบสุดท้ายที่นั่น ...

ในกรณีเช่นนี้คุณอาจต้องการใช้สิ่งต่อไปนี้มันจะกลับมา [1,2,3]

var arr = [1,2,3,4];
console.log(arr.splice(0,arr.length-1));

ในขณะที่.pop()จะกลับมา4:

var arr = [1,2,3,4];
console.log(arr.pop());

ซึ่งอาจไม่เป็นที่ต้องการ ...

หวังว่านี่จะช่วยคุณประหยัดเวลา


1
ขอบคุณเพื่อนนี่เป็นตัวอย่างที่แน่นอนที่ฉันต้องใช้ ฉันขอขอบคุณ :)
Barry Michael Doyle

2
นี่คือคำตอบที่ถูกต้องที่สุด มันเป็นความอัปยศอื่น ๆ ที่มีอันดับสูงกว่า
mmla


12

คุณสามารถใช้ arr.pop()

สิ่งนี้จะลบรายการสุดท้ายของอาร์เรย์

var arr = [1,0,2]; 
var popped = arr.pop();//Now arr = [1,0] & popped = 2

8

เพียงใช้สิ่งต่อไปนี้สำหรับกรณีการใช้งานของคุณ:

var arr = [1,2,3,4];
arr.pop() //returns 4 as the value
arr // value 4 is removed from the **arr** array variable

เพียงแค่ทราบ เมื่อคุณใช้pop()งานฟังก์ชั่นแม้ว่าบรรทัดจะคืนค่าไอเท็มที่ผุดออกอาเรย์ดั้งเดิมจะได้รับผลกระทบและองค์ประกอบที่ถูกดึงจะถูกลบออก


7

คุณสามารถทำได้สองวิธีโดยใช้splice():

  1. arr.splice(-1,1)
  2. arr.splice(arr.length-1,1)

splice(position_to_start_deleting, how_many_data_to_delete) ใช้สองพารามิเตอร์

position_to_start_deleting: ดัชนีที่เป็นศูนย์จากที่จะเริ่มลบ how_many_data_to_delete: จากดัชนีที่ระบุจำนวนข้อมูลที่ต่อเนื่องกันควรถูกลบ

นอกจากนี้คุณยังสามารถลบองค์ประกอบสุดท้ายโดยใช้pop()เป็นpop()ลบองค์ประกอบสุดท้ายจากบางอาร์เรย์
ใช้arr.pop()


6

arr.slice(-1)จะส่งคืนสำเนาขององค์ประกอบสุดท้ายของอาร์เรย์ แต่ปล่อยให้อาร์เรย์เดิมไม่มีการแก้ไข

ในการลบnองค์ประกอบสุดท้ายออกจากอาร์เรย์ให้ใช้arr.splice(-n) (สังเกตเครื่องหมาย "p" ใน "splice") ค่าส่งคืนจะเป็นอาร์เรย์ใหม่ที่มีองค์ประกอบที่ถูกลบ

เรียบง่ายขึ้นสำหรับn == 1ใช้งานval = arr.pop()



5

วิธีนี้มีประโยชน์มากกว่าในการลบและเก็บองค์ประกอบสุดท้ายของอาร์เรย์

var sampleArray = [1,2,3,4];// Declaring the array
var lastElement = sampleArray.pop();//this command will remove the last element of `sampleArray` and stores in a variable called `lastElement` so that you can use it if required.

ตอนนี้ผลลัพธ์คือ:

console.log(sampleArray); //This will give you [1,2,3]
console.log(lastElement); //this will give you 4

มันแตกต่างกันอย่างไรกับคำตอบนี้?
mpaskov

ใช่นั่นจริง แต่อันนี้ละเอียดกว่า คำตอบของคุณยากที่จะเข้าใจสำหรับผู้เริ่มต้น
razat naik

4

เป็นที่น่าสังเกตว่าsliceทั้งสองจะส่งคืนอาร์เรย์ใหม่ในขณะที่.pop()และ.splice()จะกลายพันธุ์อาร์เรย์ที่มีอยู่

ถ้าคุณชอบจัดการคอลเลกชันของข้อมูลด้วยรูปแบบคำสั่งที่ถูกโยงโซ่คุณจะต้องยึดติดกับsliceสิ่งนี้

ตัวอย่างเช่น:

myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

var newArrayOfThings = myArray
  .filter(x => x > 5)              // only bigly things
  .slice(-1)                       // get rid of the last item
  .map(x => `The number is: ${x}`);// map to a set of strings

มันจะต้องมากขึ้นเกี่ยวกับการล้อเล่นและการจัดการตัวแปรที่จะทำแบบเดียวกับสิ่งที่อยู่กับ "ป๊อป" ตั้งแต่แตกต่างmap,filterฯลฯ คุณไม่ได้รับกลับแถวใหม่

มันเป็นสิ่งเดียวกันกับpushที่เพิ่มรายการลงในส่วนท้ายของอาร์เรย์ คุณอาจจะดีกว่าด้วยconcatเพราะนั่นจะทำให้คุณไหลต่อไปได้

myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

var newArrayOfThings = myArray
  .filter(x => x > 5)              // only bigly things
  .slice(-1)                       // get rid of the "10"
  .concat([100])                   // note with concat, you must pass an array
  .map(x => `The number is: ${x}`) // map to a set of strings
  


3

splice (ดัชนี howmany) - วิธีนี้ฟังดูดี แต่นี้howmanyจะทำงานเฉพาะสำหรับดัชนีอาร์เรย์บวก ในการลบสองรายการสุดท้ายหรือสามรายการให้ใช้ดัชนีของตัวเอง

ตัวอย่างเช่น splice (-2) เพื่อลบสองรายการสุดท้าย splice (-3) สำหรับการลบสามรายการสุดท้าย



3
var a = [1,2,3,4,5,6]; 
console.log(a.reverse().slice(1).reverse());
//Array(5) [ 1, 2, 3, 4, 5 ]

ในขณะที่รหัสนี้อาจตอบคำถามให้บริบทเพิ่มเติมเกี่ยวกับวิธีการและ / หรือทำไมมันแก้ปัญหาจะปรับปรุงค่าระยะยาวของคำตอบ
Vasilisa

3

2019 โซลูชั่น ECMA5:

const new_arr = arr.reduce((d, i, idx, l) => idx < l.length - 1 ? [...d, i] : d, [])

ไม่ทำลายล้างซับทั่วไปและต้องการเพียงคัดลอกและวางที่ส่วนท้ายของอาร์เรย์


1
'ไม่ทำลาย' I would like to remove the last element ไม่ได้เสียงเหมือนสิ่งที่คำถามเดิมต้องการ: ที่ต้องการการดำเนินการทำลาย / การกลายพันธุ์ในอาร์เรย์เดิม
Ben Hull

2

บอกว่าคุณมี var arr = [1,0,2]

arr.splice(-1,1)จะกลับมาหาคุณarray [1,0];ในขณะที่ arr.slice(-1,1)จะกลับมาหาคุณarray [2];


1

นี่เป็นวิธีที่ดีในการลบรายการสุดท้าย:

if (arr != null && arr != undefined && arr.length > 0) {
      arr.splice(arr.length - 1, 1);
}

รายละเอียดของรอยต่อดังต่อไปนี้:

splice (startIndex จำนวน splice)


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

stack.reverse().shift();

stack.push(0);

การส่งออกจะได้รับ: อาร์เรย์ [0,1,2,3,4,5] สิ่งนี้จะช่วยให้คุณสามารถเก็บองค์ประกอบอาร์เรย์จำนวนเท่าเดิมในขณะที่คุณกดค่าใหม่


คุณต้องย้อนกลับอีกครั้งหลังจากกะหรือหลังจากที่คุณได้รับการสั่งซื้อที่ถูกต้องอีกครั้ง
cyptus

ย้อนกลับย้อนกลับอาร์เรย์เดิม ได้จับฉันออก ... ช่วยบอกครั้งหรือสองครั้ง ...
Simon_Weaver

1

อีกวิธีคือกรองตามดัชนี:

arr.filter((element, index) => index < arr.length - 1);

หมายเหตุ: filter()สร้างอาร์เรย์ใหม่ไม่เปลี่ยนรายการที่มีอยู่เดิม


0

หากคุณต้องการลบรายการ n ออกจากจุดสิ้นสุดของอาร์เรย์ใน javascript คุณสามารถใช้:

arr.splice(-n, n);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.