ฉันจะแปลงวัตถุ“ อาร์กิวเมนต์” เป็นอาร์เรย์ใน JavaScript ได้อย่างไร


433

argumentsวัตถุใน JavaScript เป็นหูดว่ามันแปลกทำหน้าที่เช่นเดียวกับอาร์เรย์ในสถานการณ์ส่วนใหญ่ แต่ก็ไม่จริงวัตถุอาร์เรย์ ตั้งแต่มันจริงๆสิ่งอื่นทั้งหมดก็ไม่ได้มีฟังก์ชั่นที่มีประโยชน์จากArray.prototypeเช่นforEach, sort, และfiltermap

มันง่ายมากที่จะสร้างอาร์เรย์ใหม่จากอ็อบเจกต์อาร์กิวเมนต์ด้วยลูป ตัวอย่างเช่นฟังก์ชันนี้เรียงลำดับอาร์กิวเมนต์:

function sortArgs() {
    var args = [];
    for (var i = 0; i < arguments.length; i++)
        args[i] = arguments[i];
    return args.sort();
}

อย่างไรก็ตามนี่เป็นสิ่งที่น่าสมเพชที่ต้องทำเพื่อเข้าถึงฟังก์ชันอาร์เรย์ JavaScript ที่มีประโยชน์อย่างยิ่ง มีวิธีการในตัวที่จะใช้ไลบรารีมาตรฐานหรือไม่?


เกี่ยวข้องอย่างใกล้ชิด: Array.prototype.slice.call () ทำงานอย่างไร
Bergi

คำตอบ:


725

ES6 โดยใช้พารามิเตอร์ที่เหลือ

หากคุณสามารถใช้ ES6 คุณสามารถใช้:

พารามิเตอร์ที่เหลือ

function sortArgs(...args) {
  return args.sort(function (a, b) { return a - b; });
}

document.body.innerHTML = sortArgs(12, 4, 6, 8).toString();

ตามที่คุณสามารถอ่านได้ในลิงค์

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

หากคุณอยากรู้เกี่ยวกับ...ไวยากรณ์ก็จะเรียกว่าการแพร่กระจายผู้ประกอบการและคุณสามารถอ่านเพิ่มเติมที่นี่

ES6 ใช้ Array.from ()

ใช้Array.from :

function sortArgs() {
  return Array.from(arguments).sort(function (a, b) { return a - b; });
}

document.body.innerHTML = sortArgs(12, 4, 6, 8).toString();

Array.from เพียงแค่แปลง Array-like หรือ Iterable objects เป็น Array อินสแตนซ์



ES5

คุณสามารถจริงเพียงแค่ใช้Arrayของsliceฟังก์ชั่นในวัตถุข้อโต้แย้งและมันจะแปลงเป็นอาร์เรย์ JavaScript มาตรฐาน คุณเพียงแค่ต้องอ้างอิงด้วยตนเองผ่านทางต้นแบบของ Array:

function sortArgs() {
    var args = Array.prototype.slice.call(arguments);
    return args.sort();
}

ทำไมจึงใช้งานได้ นี่คือข้อความที่ตัดตอนมาจากเอกสาร ECMAScript 5 เอง :

หมายเหตุ : sliceฟังก์ชั่นทั่วไปโดยเจตนา; ไม่ต้องการให้ค่านี้เป็นวัตถุ Array ดังนั้นจึงสามารถถ่ายโอนไปยังวัตถุประเภทอื่นเพื่อใช้เป็นวิธีการ ไม่ว่าจะเป็นsliceฟังก์ชั่นสามารถนำมาใช้ประสบความสำเร็จกับวัตถุโฮสต์คือการดำเนินการขึ้นอยู่กับ

ดังนั้นsliceทำงานกับทุกสิ่งที่มีlengthคุณสมบัติซึ่งargumentsจะสะดวก


หากArray.prototype.sliceคุณมีคำหนึ่งคำมากเกินไปคุณสามารถย่อได้เล็กน้อยโดยใช้ตัวอักษรแถวลำดับ:

var args = [].slice.call(arguments);

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


5
ใน Firefox รุ่นล่าสุด (2.0?) และ ECMAScript 5 มีวิธี Array.slice ที่ทำให้ง่ายขึ้นเล็กน้อย คุณจะเรียกมันว่า: var arge = Array.slice (อาร์กิวเมนต์, 0);
Matthew Crumley

9
อะไร0หา? เนื่องจากมีข้อโต้แย้งที่คุณไม่ต้องการที่จะผ่านทำไมไม่สามารถที่คุณเพียงแค่ใช้var args = Array.prototype.slice.call(arguments);? [ หลวงเมืองข้อโต้แย้งหน้า ] ( developer.mozilla.org/en/JavaScript/Reference/... ) 0แสดงให้เห็นวิธีการได้โดยไม่ต้อง
Peter Ajtai

3
@ Barney - การเรียงลำดับเป็นสิ่งจำเป็นเพราะคำถามเดิมต้องการเรียงลำดับอาร์กิวเมนต์ หากคุณต้องการแปลงเป็นอาเรย์ก็ไม่จำเป็น
Krease

17
"คุณไม่ควรใช้การขัดแย้งเพราะป้องกันการปรับให้เหมาะสมในเอนจิ้น JavaScript (เช่น V8)" - จาก MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
frameworkninja

3
ฉันไม่แน่ใจว่าจะตอบคำถามเดิมหรือไม่ เวลาผ่านไป ด้วย ES6 ที่ทดลองใน Firefox และ Chrome พารามิเตอร์ที่เหลือก็กลายเป็นทางเลือกที่ดี - function sortArgs(...argsToSort) { return argsToSort.sort(); }จาก MDN developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

40

นอกจากนี้ยังเป็นการคุ้มค่าที่จะอ้างอิงถึงหน้า Bluebird ของสัญญาห้องสมุดที่แสดงวิธีการจัดการargumentsวัตถุให้เป็นอาร์เรย์ด้วยวิธีที่ทำให้ฟังก์ชั่นปรับให้เหมาะสมภายใต้เอนจิ้น V8 JavaScript :

function doesntLeakArguments() {
    var args = new Array(arguments.length);
    for(var i = 0; i < args.length; ++i) {
        args[i] = arguments[i];
    }
    return args;
}

var args = [].slice.call(arguments);วิธีนี้จะใช้ในความโปรดปรานของ ผู้เขียนยังแสดงให้เห็นว่าขั้นตอนการสร้างสามารถช่วยลดความฟุ่มเฟื่อยได้อย่างไร


2
+1 และขอบคุณสำหรับลิงค์ไปยังหน้า Bluebird Optimization Killer PS: ผมเคยเห็นเมื่อเร็ว ๆ นี้การเพิ่มประสิทธิภาพนี้ใช้ในโหนด thunkifyโครงการ
Yves M.

29
function sortArgs(){ return [].slice.call(arguments).sort() }

// Returns the arguments object itself
function sortArgs(){ return [].sort.call(arguments) }

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

[].sort.call({0:1, 1:0, length:2}) // => ({0:0, 1:1, length:2})

12

ใช้:

function sortArguments() {
  return arguments.length === 1 ? [arguments[0]] :
                 Array.apply(null, arguments).sort();
}

Array(arg1, arg2, ...) ผลตอบแทน [arg1, arg2, ...]

Array(str1) ผลตอบแทน [str1]

Array(num1)ส่งคืนอาร์เรย์ที่มีnum1องค์ประกอบ

คุณต้องตรวจสอบจำนวนข้อโต้แย้ง!

Array.slice รุ่น (ช้ากว่า):

function sortArguments() {
  return Array.prototype.slice.call(arguments).sort();
}

Array.push รุ่น (ช้ากว่าเร็วกว่าชิ้น):

function sortArguments() {
  var args = [];
  Array.prototype.push.apply(args, arguments);
  return args.sort();
}

ย้ายเวอร์ชัน (ช้ากว่า แต่เล็กกว่าเร็วกว่า):

function sortArguments() {
  var args = [];
  for (var i = 0; i < arguments.length; ++i)
    args[i] = arguments[i];
  return args.sort();
}

Array.concat เวอร์ชัน (ช้าที่สุด):

function sortArguments() {
  return Array.prototype.concat.apply([], arguments).sort();
}

1
โปรดทราบว่าเนื่องจากพฤติกรรมการแบนใน Array.concat จะยอมรับอาร์กิวเมนต์อาเรย์ sortArguments (2, [3,0], 1) ส่งคืนค่า 0,1,2,3
Hafthor

9

หากคุณกำลังใช้ jQuery ต่อไปนี้เป็นข้อตกลงที่ดีกว่าในความคิดของฉัน:

function sortArgs(){
  return $.makeArray(arguments).sort();
}

1
นั่นคือสิ่งที่ฉันกำลังมองหาใน JS บริสุทธิ์ แต่ +1 สำหรับตัวอย่างที่ชัดเจนว่า jQuery ทำให้ JS ง่ายขึ้นอย่างไร
Andrew Coleson

2
"นอกจากจะรวมแท็กอื่นสำหรับเฟรมเวิร์ก / ไลบรารีแล้วคาดว่าจะได้คำตอบของ JavaScript อย่างแท้จริง"
MichałPerłakowski

6

ใน ECMAScript 6 ไม่มีความจำเป็นต้องใช้ hacks Array.prototype.slice()น่าเกลียดเช่น คุณสามารถใช้แทนไวยากรณ์การแพร่กระจาย (... )

(function() {
  console.log([...arguments]);
}(1, 2, 3))

มันอาจดูแปลก แต่ก็ค่อนข้างง่าย มันแค่แยกargumentsองค์ประกอบและใส่กลับเข้าไปในอาร์เรย์ หากคุณยังไม่เข้าใจให้ดูตัวอย่างนี้:

console.log([1, ...[2, 3], 4]);
console.log([...[1, 2, 3]]);
console.log([...[...[...[1]]]]);

หมายเหตุว่ามันไม่ได้ทำงานในเบราว์เซอร์รุ่นเก่าบางรุ่นเช่น IE 11 ดังนั้นหากคุณต้องการที่จะสนับสนุนเบราว์เซอร์เหล่านี้คุณควรใช้Babel


5

นี่คือเกณฑ์มาตรฐานของวิธีการหลายแปลงอาร์กิวเมนต์เป็นอาร์เรย์

สำหรับฉันแล้วทางออกที่ดีที่สุดสำหรับข้อโต้แย้งเล็กน้อยคือ:

function sortArgs (){
  var q = [];
  for (var k = 0, l = arguments.length; k < l; k++){
    q[k] = arguments[k];
  }
  return q.sort();
}

สำหรับกรณีอื่น ๆ :

function sortArgs (){ return Array.apply(null, arguments).sort(); }

+1 สำหรับการวัดประสิทธิภาพ ปัจจุบันกราฟแสดงของคุณsortArgsคือ 6 ครั้งเร็วใน Firefox แต่เป็นสองเท่าช้าในการล่าสุดของ Chrome Array.applyเมื่อเทียบกับ
joeytwiddle

1
เนื่องจาก Array.prototype.slice เลิกใช้แล้วเพราะมันป้องกันการเพิ่มประสิทธิภาพของเครื่องยนต์ JS V8 ฉันคิดว่านี่เป็นทางออกที่ดีที่สุดจนกว่า ES6 จะเปิดให้ใช้กันอย่างแพร่หลาย +1
Sasha

1
ยิ่งไปกว่านั้นวิธีการทั่วไปของอาเรย์เช่น Array.slice () ก็เลิกใช้แล้ว
Sasha

4

ฉันขอแนะนำให้ใช้ตัวดำเนินการสเปรด ECMAScript 6 ซึ่งจะผูกพารามิเตอร์การติดตามลงในอาร์เรย์ ด้วยวิธีนี้คุณไม่จำเป็นต้องสัมผัสargumentsวัตถุและรหัสของคุณจะง่ายขึ้น ข้อเสียของโซลูชันนี้คือมันไม่สามารถใช้ได้กับเบราว์เซอร์ส่วนใหญ่ดังนั้นคุณจะต้องใช้คอมไพเลอร์ JS เช่น Babel ภายใต้ประทุน Babel เปลี่ยนargumentsเป็น Array พร้อมห่วง for

function sortArgs(...args) {
  return args.sort();
}

หากคุณไม่สามารถใช้ ECMAScript 6 ได้ฉันขอแนะนำให้ดูคำตอบอื่น ๆ เช่น @Jonathan Fingland

function sortArgs() {
    var args = Array.prototype.slice.call(arguments);
    return args.sort();
}

4

Lodash:

var args = _.toArray(arguments);

ในการดำเนินการ:

(function(){ console.log(_.toArray(arguments).splice(1)); })(1, 2, 3)

ผลิต:

[2,3]

6
ทำไม_.toArrayล่ะ
Menixator

5
แต่_.toArrayมีความเหมาะสมกว่า
Menixator

ฉันจะโต้แย้ง _.slice มีความเหมาะสมมากขึ้นเนื่องจากคุณมักจะต้องการวางข้อโต้แย้งบางอย่าง
Hafthor

4

ใช้Array.from()ซึ่งใช้วัตถุคล้ายอาร์เรย์ (เช่นarguments) เป็นอาร์กิวเมนต์และแปลงเป็นอาร์เรย์:

(function() {
  console.log(Array.from(arguments));
}(1, 2, 3));

หมายเหตุว่ามันไม่ได้ทำงานในเบราว์เซอร์รุ่นเก่าบางรุ่นเช่น IE 11 ดังนั้นหากคุณต้องการที่จะสนับสนุนเบราว์เซอร์เหล่านี้คุณควรใช้Babel



1

คำตอบอื่น

ใช้คาถามนต์ดำ:

function sortArguments() {
  arguments.__proto__ = Array.prototype;
  return arguments.slice().sort();
}

Firefox, Chrome, Node.js, IE11 ก็โอเค


6
นี่เป็นทางออกที่ดีที่สุดแน่นอนถ้าคุณต้องการทำให้โค้ดไม่สามารถอ่านได้อย่างสมบูรณ์ ยัง__proto__เลิกใช้แล้ว ดูเอกสาร MDN
MichałPerłakowski

1

ลองใช้ดู Object.setPrototypeOf()

คำอธิบาย: การตั้งค่าprototypeของargumentsการArray.prototype

function toArray() {
  return Object.setPrototypeOf(arguments, Array.prototype)
} 

console.log(toArray("abc", 123, {def:456}, [0,[7,[14]]]))


คำอธิบาย: นำแต่ละดัชนีของargumentsวางรายการลงในอาร์เรย์ที่ดัชนีที่สอดคล้องกันของอาร์เรย์

สามารถใช้อีกทางเลือกหนึ่ง Array.prototype.map()

function toArray() {
  return [].map.call(arguments, (_,k,a) => a[k])
} 

console.log(toArray("abc", 123, {def:456}, [0,[7,[14]]]))


คำอธิบาย: นำแต่ละดัชนีของargumentsวางรายการลงในอาร์เรย์ที่ดัชนีที่สอดคล้องกันของอาร์เรย์

for..of ห่วง

function toArray() {
 let arr = []; for (let prop of arguments) arr.push(prop); return arr
} 

console.log(toArray("abc", 123, {def:456}, [0,[7,[14]]]))


หรือ Object.create()

คำอธิบาย: สร้างวัตถุตั้งค่าคุณสมบัติของวัตถุไปยังรายการที่ดัชนีของแต่ละarguments; ชุดprototypeของวัตถุที่สร้างขึ้นเพื่อArray.prototype

function toArray() {
  var obj = {};
  for (var prop in arguments) {
    obj[prop] = {
      value: arguments[prop],
      writable: true,
      enumerable: true,
      configurable: true
    }
  } 
  return Object.create(Array.prototype, obj);
}

console.log(toArray("abc", 123, {def: 456}, [0, [7, [14]]]))


คุณได้ถามคนอื่นว่าคำตอบของคุณตรงตามคำเตือนหรือไม่ภายใต้คำถามเกี่ยวกับ "คำตอบยาว ๆ " ดูเหมือนว่าปัญหาหลักของคำตอบของคุณคือคุณไม่ได้อธิบายว่าทำไมจึงควรใช้วิธีการใด ๆ ที่คุณแสดงที่นี่ ไม่มีทางที่ฉันจะใช้วิธีแก้ปัญหาที่คุณเสนอเพราะมันแย่กว่าโซลูชันในคำตอบที่ยอมรับ ตัวอย่างเช่นการอ้างอิงของคุณไปยังเอกสารการObject.setPrototypeOfเตือนว่าเป็นการ "ดำเนินการช้ามาก" ทำไมบนโลกนี้ฉันจะใช้มันมากกว่านี้Array.prototype.slice.call?
หลุยส์

@Louis อัพเดตคำตอบพร้อมคำอธิบายสำหรับแต่ละวิธี คำถามที่ OP ดูเหมือนจะเป็น"มีวิธีใช้ในตัวโดยใช้ไลบรารีมาตรฐานหรือไม่" ไม่ใช่"ทำไมจึงควรใช้วิธีการใด ๆ "ที่มีในตัว ผู้ใช้ใด ๆ ที่โพสต์คำตอบจะสามารถตัดสินได้อย่างถูกต้องว่าโซลูชั่นที่โพสต์นั้น "ถูกต้อง" สำหรับ OP อย่างไร ดูเหมือนว่ามันขึ้นอยู่กับ OP เพื่อพิจารณาสิ่งนี้? ที่จริงแล้วในส่วนของการแจ้งเตือนนี้คือสิ่งที่สนใจผู้ใช้นี้: "อธิบายว่าทำไมคำตอบคือถูกต้อง" ทำคำตอบใด ๆ ให้กับรัฐคำถามนี้: "คำตอบนี้คือ" ถูกต้อง "เพราะ: x, y, z"?
guest271314

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

1

นี่คือโซลูชันที่สะอาดและรัดกุม:

function argsToArray() {
  return Object.values(arguments);
}

// example usage
console.log(
  argsToArray(1, 2, 3, 4, 5)
  .map(arg => arg*11)
);

Object.values( )จะกลับค่าของวัตถุเป็นอาร์เรย์และตั้งแต่argumentsเป็นวัตถุเป็นหลักจะแปลงargumentsเป็นอาร์เรย์จึงให้คุณด้วยทั้งหมดของอาร์เรย์ฟังก์ชั่นผู้ช่วยเช่นmap, forEach, filterฯลฯ


0

Benshmarck 3 วิธี:

function test()
{
  console.log(arguments.length + ' Argument(s)');

  var i = 0;
  var loop = 1000000;
  var t = Date.now();
  while(i < loop)
  {
      Array.prototype.slice.call(arguments, 0); 
      i++;
  }
  console.log(Date.now() - t);


  i = 0,
  t = Date.now();
  while(i < loop)
  {
      Array.apply(null, arguments);
      i++;
  }
  console.log(Date.now() - t);

  i = 0,
  t = Date.now();
  while(i < loop)
  {
      arguments.length == 1 ? [arguments[0]] : Array.apply(null, arguments);
      i++;
  }
  console.log(Date.now() - t);
}

test();
test(42);
test(42, 44);
test(42, 44, 88, 64, 10, 64, 700, 15615156, 4654, 9);
test(42, 'truc', 44, '47', 454, 88, 64, '@ehuehe', 10, 64, 700, 15615156, 4654, 9,97,4,94,56,8,456,156,1,456,867,5,152489,74,5,48479,89,897,894,894,8989,489,489,4,489,488989,498498);

ผลลัพธ์?

0 Argument(s)
256
329
332
1 Argument(s)
307
418
4
2 Argument(s)
375
364
367
10 Argument(s)
962
601
604
40 Argument(s)
3095
1264
1260

สนุก !


1
ต้องการแนะนำให้แก้ไขสิ่งที่ต้องการarguments.length == 1?[arguments[0]]:Array.apply(null, arguments);ป้องกันไม่ให้เรียกใช้ฟังก์ชันโดยมีอาร์กิวเมนต์จำนวนเต็มเพียงตัวเดียวdummyFn(3)และทำให้เกิดผลลัพธ์[,,]
ไม่เป็นไร

@ ไม่เป็นไรงานที่ดีฉันแก้ไขรุ่นของคุณดีกว่า;) แต่ฉันไม่เข้าใจdummyFn(3)สิ่งนี้คืออะไร? ไม่มีฟังก์ชั่นนี้ ...
เมทริกซ์

เอ่อ ... ไม่เป็นไรตัวอย่างเพียงแค่ต้องการแสดงให้เห็นว่าฟังก์ชั่นที่เรียกว่ามีอาร์กิวเมนต์จำนวนเต็มเพียงหนึ่งเดียวและทำให้เกิดอาร์เรย์ว่างเปล่าขนาดคงที่ขอโทษสำหรับภาษาอังกฤษของฉัน
ไม่เป็นไร


0

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

function sortArgs() {
  return [...arguments].sort()
}

[...arguments]ถือได้ว่าเป็นทางเลือกประเภทหนึ่งArray.from(arguments)ซึ่งยังใช้งานได้อย่างสมบูรณ์แบบ

ทางเลือก ES7 คือความเข้าใจอาร์เรย์:

[for (i of arguments) i].sort()

นี่อาจเป็นวิธีที่ง่ายที่สุดถ้าคุณต้องการประมวลผลหรือกรองข้อโต้แย้งก่อนที่จะเรียงลำดับ:

[for (i of arguments) if (i % 2) Math.log(i)].sort()

0
 function x(){
   var rest = [...arguments]; console.log(rest);return     
   rest.constructor;
 };
 x(1,2,3)

ฉันลองใช้เทคนิคการทำลายล้างอย่างง่าย


0

วัตถุอากิวเมนต์มีให้ใช้งานภายในร่างกายของฟังก์ชันเท่านั้น แม้ว่าคุณสามารถจัดทำดัชนีวัตถุอาร์กิวเมนต์เช่นอาร์เรย์ได้ แต่ก็ไม่ใช่อาร์เรย์ มันไม่มีคุณสมบัติของอาเรย์ใด ๆ นอกจากความยาว

// function arguments length 5
function properties(a,b,c,d,e){
var function_name= arguments.callee.name
var arguments_length= arguments.length;
var properties_length=  properties.length; 
var function_from= properties.caller.name;
console.log('I am the function name: '+ function_name);
console.log('I am the function length, I am function spacific: '+ properties_length); 
console.log('I am the arguments length, I am context/excution spacific: '+ arguments_length);
console.log('I am being called From: '+  function_from );
}

// arguments 3
function parent(){
properties(1,2,3);
}

//arguments length 3 because execution spacific
parent();

แม้ว่าจะสามารถจัดทำดัชนีเหมือนอาร์เรย์ตามที่คุณเห็นในตัวอย่างนี้:

function add(){

var sum=0;

for(var i=0; i< arguments.length;i++){

sum = sum + arguments[i];

}

return sum;

}

console.log(add(1,2,3));

อย่างไรก็ตามวัตถุอาร์กิวเมนต์ไม่ใช่อาร์เรย์และไม่มีคุณสมบัติอื่นใดนอกจากความยาว

คุณสามารถแปลงวัตถุอาร์กิวเมนต์เป็นอาร์เรย์ที่จุดที่คุณสามารถเข้าถึงวัตถุอาร์กิวเมนต์

มีหลายวิธีที่คุณสามารถเข้าถึงอ็อบเจ็กต์อาร์กิวเมนต์ภายในเนื้อความฟังก์ชันและสิ่งเหล่านี้รวมถึง:

  1. คุณสามารถเรียกใช้วิธีการ Array.prototoype.slice.call

Array.prototype.slice.call (อาร์กิวเมนต์)

function giveMeArgs(arg1,arg2){

var args = Array.prototype.slice.call(arguments);
return args
}

console.log( giveMeArgs(1,2));

  1. คุณสามารถใช้อาร์เรย์ตัวอักษร

[] .slice.call (อาร์กิวเมนต์)

function giveMeArgs(arg1,arg2){

var args = [].slice.call(arguments);

return args;

}

console.log( giveMeArgs(1,2) );

  1. คุณสามารถใช้ส่วนที่เหลือ ...

function giveMeArgs(...args){

return args;

}

console.log(giveMeArgs(1,2))

  1. คุณสามารถใช้สเปรด [... ]

function giveMeArgs(){

var args = [...arguments];
return args;

}

console.log(giveMeArgs(1,2));

  1. คุณสามารถใช้ Array.from ()

function giveMeArgs(){

var args = Array.from(arguments);

return args;

}

console.log(giveMeArgs(1,2));


0

คุณสามารถสร้างฟังก์ชั่นที่ใช้ซ้ำได้เพื่อทำกับอาร์กิวเมนต์ใด ๆ ฟังก์ชันที่ง่ายที่สุดคืออะไร:

function sortArgs() {
  return [...arguments].sort();
}

sortArgs('ali', 'reza', 1, 2, 'a'); //[1, 2, "a", "ali", "reza"];

ไวยากรณ์สเปรดสามารถใช้ในES6ขึ้นไป ...

แต่ถ้าคุณต้องการใช้สิ่งที่เข้ากันได้กับES5และด้านล่างคุณสามารถใช้Array.prototype.slice.callเพื่อให้รหัสของคุณมีลักษณะดังนี้:

function sortArgs() {
  return Array.prototype.slice.call(arguments).sort();
}

sortArgs('ali', 'reza', 1, 2, 'a'); //[1, 2, "a", "ali", "reza"];

นอกจากนี้ยังมีวิธีการอื่น ๆ อีกสองสามตัวอย่างเช่นการใช้Array.fromหรือวนรอบอาร์กิวเมนต์และกำหนดให้กับอาร์เรย์ใหม่ ...


-2

นี่เป็นคำถามที่เก่ามาก แต่ฉันคิดว่าฉันมีโซลูชันที่พิมพ์ได้ง่ายกว่าโซลูชันก่อนหน้าเล็กน้อยและไม่พึ่งพาไลบรารีภายนอก:

function sortArguments() {
  return Array.apply(null, arguments).sort();
}

2
Array.applyจะไม่ทำงานหากคุณมีอาร์กิวเมนต์จำนวนเต็มบวกเพียงตัวเดียว มันเป็นเพราะสร้างความยาวอาร์เรย์ของnew Array(3) 3การจะมีความเฉพาะเจาะจงมากขึ้นผลที่ได้จะเป็นและไม่ได้[undefined, undefined, undefined] [3]
inf3rno
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.