ทำความเข้าใจวิธีการทำงานของฟังก์ชันลด()

ฉันแค่ต้องแน่ใจว่าฉันรู้ว่าฟังก์ชันนี้ทำงานอย่างไร ฉันอ่านเนื้อหาและดูวิดีโอเกี่ยวกับฟังก์ชันลดขนาดประมาณ 3 ชั่วโมงเมื่อคืนนี้ ฉันไม่เข้าใจ ฉันก้าวออกจากคอมพิวเตอร์ ทำอาหาร ดูรายการทีวี แล้วก็ดูคอมพิวเตอร์อีกครั้ง และ BAM! ฉันเข้าใจแล้ว. ฉันรู้แล้วว่าฟังก์ชันลดทำงานอย่างไร

ฉันไม่รู้ว่าเหตุใดตัวอย่างแรกด้านล่างจึงใช้งานได้ในขณะที่ตัวอย่างที่สองไม่ทำงาน

แหล่งที่มา: Eloquent Javascript Ch. 5 §การทำให้แบนราบ

วิธีนี้ได้ผล:

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

var flattened = arrays.reduce(function(a, b) {
  return a.concat(b);
});

flattened; //=>[1, 2, 3, 4, 5, 6]

ฉันพยายามเล่นซอกับโค้ดเพื่อเปลี่ยนตัวแปรเป็นฟังก์ชัน และอย่างใดฉันก็ทำลายมัน ด้านล่างนี้ส่งคืน undefined และฉันไม่แน่ใจว่าทำไม

สิ่งนี้ใช้ไม่ได้:

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

function flattened(arr){
  arr.reduce(function(a, b) {
    return a.concat(b);
  });
}
flattened(arrays); //=> undefined

เหตุใดฟังก์ชันแรกจึงใช้งานได้ แต่ไม่ใช่ฟังก์ชันที่สอง ฉันแน่ใจว่ามันเป็นสิ่งเล็กน้อยที่ฉันขาดหายไป


person jward01    schedule 01.08.2015    source แหล่งที่มา


คำตอบ (3)


เนื่องจากฟังก์ชัน flattened ไม่ส่งคืนสิ่งใดเลย

function flattened(arr){
  /* “return” needs to be here */ arr.reduce(function(a, b) { // No return from the outer wrapper function “flattened”
    return a.concat(b); // return from the inner function “reduce”
  });
}

ฟังก์ชั่นที่อยู่ภายในจะส่งคืนบางสิ่ง แต่ฟังก์ชันที่มีอยู่จะไม่ส่งคืน

person Sebastian Simon    schedule 01.08.2015
comment
อ่า สมเหตุสมผลแล้ว!! ขอบคุณ! ฉันค่อนข้างใหม่กับ JS แต่ฉันกำลังเรียนรู้อย่างรวดเร็ว กระบวนการง่ายๆ แบบนี้ทำให้ฉันสับสนในบางครั้ง ขอบคุณ! - person jward01; 01.08.2015

คุณต้อง return จากฟังก์ชัน flattened

function flattened(arr){
  return arr.reduce(function(a, b) {
    return a.concat(b);
  });
}
person Zachary Kuhn    schedule 01.08.2015
comment
ขอบคุณ! ดังนั้นเพื่อความเข้าใจของฉัน ... ในตัวอย่างที่ 'ใช้งานไม่ได้' ฉันส่งคืน concat ไปที่ฟังก์ชันลด แต่ฉันไม่ได้คืนฟังก์ชันลดให้กับฟังก์ชันที่แบนราบ - person jward01; 01.08.2015
comment
@ jward01 ไม่ได้ส่งคืน ผลลัพธ์ ของ reduce/concat ไม่ใช่ reduce/concat เอง - person Andrew Marshall; 01.08.2015

flattened() จำเป็นต้องคืนค่าดังนี้:

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

function flattened(arr){
return arr.reduce(function(a, b) {
  return a.concat(b);
});
}
flattened(arrays);
person Shambhavi    schedule 01.08.2015