วิธีรับ subarray จาก array?


คำตอบ:


408

ลองดูที่ Array.slice(begin, end)

const ar  = [1, 2, 3, 4, 5];

// slice from 1..3 - add 1 as the end index is not included

const ar2 = ar.slice(1, 3 + 1);

console.log(ar2);


22
มันอาจจะคุ้มค่าที่จะกล่าวถึงที่นี่อย่างชัดเจนว่าต้นฉบับarไม่มีการแก้ไข console.log(ar); // -> [1, 2, 3, 4, 5]
daemonexmachina

17

เพื่อให้ง่ายต่อการใช้งานsliceให้ใช้ส่วนขยายของฉันไปที่ Array Class:

Array.prototype.subarray = function(start, end) {
    if (!end) { end = -1; } 
    return this.slice(start, this.length + 1 - (end * -1));
};

แล้ว:

var bigArr = ["a", "b", "c", "fd", "ze"];

ทดสอบ 1 :

bigArr.subarray(1, -1);

<["b", "c", "fd", "ze"]

Test2:

bigArr.subarray(2, -2);

<["c", "fd"]

test3:

bigArr.subarray(2);

<["c", "fd", "ze"]

อาจจะง่ายกว่าสำหรับนักพัฒนาซอฟต์แวร์ที่มาจากภาษาอื่น (เช่น Groovy)



สิ่งที่ K_7 พูด; โดยเฉพาะอย่างยิ่งการติดลิง Builtins ในตัว (Object, Array, Promise, ฯลฯ ) นั้นช่างซนมาก ดูตัวอย่างที่มีชื่อเสียงของMooTools บังคับให้เปลี่ยนชื่อของพื้นเมืองที่นำเสนอไปArray.prototype.contains Array.prototype.includes
daemonexmachina

ไม่ต้องพูดถึงsubarrayวิธีการของคุณให้ผลลัพธ์ที่ไม่คาดคิด bigArr.slice(1,-1)ผลตอบแทน['b','c','fd']ที่คุณคาดหวัง (-1 เคาะองค์ประกอบหนึ่งออกจากส่วนท้ายของอาร์เรย์ใหม่) แต่bigArr.subarray(1,-1)ผลตอบแทนเช่นเดียวกับbigArr.subarray(1)ที่จะพูดทุกอย่างจากตำแหน่ง 1 bigArrถึงจุดสิ้นสุดของ นอกจากนี้คุณยังบังคับให้ผู้ใช้ระบุตัวเลขติดลบเป็นendพารามิเตอร์เสมอ ใด ๆ ที่ให้ผลเช่นเดียวกับเมื่อend >= -1 end === undefinedในทางbigArr.slice(1,3)กลับกันผลตอบแทน['b','c']ที่คาดหวังอีกครั้ง
daemonexmachina

5

const array_one = [11, 22, 33, 44, 55];
const start = 1;
const end = array_one.length - 1;
const array_2 = array_one.slice(start, end);
console.log(array_2);


มันไม่ได้รวบรวมการแก้ไขที่นี่: var array_one = [11, 22, 33, 44,55]; var ar2 = array_one.slice (0, array_one.length-1); console.log (AR2)
bormat

0

คำถามที่เป็นจริงขออาร์เรย์ใหม่ดังนั้นผมเชื่อว่าเป็นทางออกที่ดีที่จะรวมคำตอบ Abdennour Toumi ของที่มีฟังก์ชั่นโคลน:

function clone(obj) {
  if (null == obj || "object" != typeof obj) return obj;
  const copy = obj.constructor();
  for (const attr in obj) {
    if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];
  }
  return copy;
}

// With the `clone()` function, you can now do the following:

Array.prototype.subarray = function(start, end) {
  if (!end) {
    end = this.length;
  } 
  const newArray = clone(this);
  return newArray.slice(start, end);
};

// Without a copy you will lose your original array.

// **Example:**

const array = [1, 2, 3, 4, 5];
console.log(array.subarray(2)); // print the subarray [3, 4, 5, subarray: function]

console.log(array); // print the original array [1, 2, 3, 4, 5, subarray: function]

[ http://stackoverflow.com/questions/728360/most-elegant-way-to-clone-a-javascript-object]


9
ฉันไม่คิดว่าชิ้นจะเปลี่ยนอาร์เรย์เดิม
มณี

10
Array.prototype.sliceส่งคืนสำเนาแล้ว Array.prototype.spliceปรับเปลี่ยนอาร์เรย์เดิม
Guido Bouman

2
Slice () วิธีการส่งกลับสำเนาตื้นของส่วนหนึ่งของอาร์เรย์เป็นวัตถุอาร์เรย์ใหม่ ดูMozilla พัฒนาเครือข่าย downvoted
TheCrazyProgrammer

ดังที่คนอื่น ๆ บอกsliceไว้แล้วส่งคืนสำเนาตื้น ๆ ทำให้subarrayการดำเนินการนี้ไม่จำเป็น แต่มันก็คุ้มค่าที่จะพูดถึงว่าคุณได้ติดสิ่งของในตัวซึ่งเป็นลิงตัวใหญ่ ดูความคิดเห็นในคำตอบของ Abdennour Toumi
daemonexmachina
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.