Underscore: _.chain & _.each tidak bermain bersama?

Dibuat pada 29 Des 2013  ·  27Komentar  ·  Sumber: jashkenas/underscore

Hai, saya tidak yakin, tetapi menurut saya ini bug:

  _.chain([1,2,3,4]).each(function(current){ console.log(current) }).value(); // returns undefined
  //where: 
  _.chain([1,2,3,4]).map(function(current){ return current; }).value() // returns expected. 

Saya kira fungsi yang dirantai harus mengembalikan nilai tetapi kemudian ketuk bukan merupakan iterable, saya mencari cara untuk mengakses nilai tanpa melepaskannya dan tanpa mutasi.

question

Komentar yang paling membantu

Apakah sekarang ada metode alternatif yang bisa dirantai dan memungkinkan modifikasi elemen array? Saya sedang mencari sesuatu seperti peek :

_.chain(myArray)
    ...
    .peek(e -> e.craftedVar = e.otherVar * 2)
    ...
    .value();

Semua 27 komentar

Itu benar. Tidak seperti map , each tidak memiliki nilai pengembalian , jadi memanggil value padanya tidak melakukan apa-apa. Jika Anda perlu melewatkan array yang bermutasi melalui rantai, yang terbaik adalah tetap menggunakan map .

ok jadi petanya, bagaimana dengan _.chain (). tap (function (values) {values.forEach (function (current) {};});
tidak tampak elegan tetapi sepertinya logis ...

Ya, terlihat bagus oleh saya:

_.chain([1,2,3,4])
 .tap(_.bind(console.log, console))
 .map(function(val) { return val * 2 })
 .value(); // [2,4,6,8]

Akan menyenangkan untuk menyebutkan bahwa masing-masing tidak mengembalikan nilai dalam dokumentasinya.

@xixixao each mengikuti semantik Array # forEach, yang juga tidak mengembalikan nilai apa pun. Jika Anda membutuhkan sesuatu yang dikembalikan, cukup gunakan map .

Saya tidak melihat apa pun yang mencegah Underscore membuat _.each dirantai. Itu rusak dengan semantik asli untuk metode lain. Ada perbedaan halus dengan menyarankan _.map seperti itu tidak mengembalikan larik yang sama dan itu membutuhkan nilai kembali dalam callback.

Mengapa masing-masing harus dapat dirantai? Anda tidak mengubah array dengan cara apa pun (cara Anda menggunakan sesuatu seperti peta atau filter), jadi tidak ada harapan bahwa nilai dapat digunakan kembali.

Mengapa masing-masing harus dapat dirantai?

Mengapa tidak mengizinkan perangkaian, apa yang bisa menyakitkan? Berguna untuk kasus seperti _(collection).each(intermediateActions).filter(...) .

Saya akan membuat metode ini tidak terdefinisi dalam konteks objek yang dibungkus.

@ dw40 tetapi apa yang Anda lakukan dalam tindakan perantara yang tidak dapat ditangani dengan lebih baik dengan peta?

tetapi apa yang Anda lakukan dalam tindakan perantara yang tidak dapat ditangani dengan lebih baik dengan peta?

Tidak masalah apa langkah perantara, ini bisa menjadi beberapa hal, manfaat dari _.each chaining adalah bahwa callback perantara tidak harus mengembalikan nilai dan tidak perlu buat larik baru.

@ dw40 ingin menyiapkan tarikan cepat? Anda sedang berbicara tentang casing khusus each sebagai bagian dari campuran, bukan?

@ akre54 Saya tahu bahwa each mengikuti forEach , saya sungguh-sungguh bermaksud bahwa akan lebih baik untuk menyebutkan perilaku dalam dokumentasi.

Yang mengatakan, saya setuju bahwa masing-masing hanya mengembalikan koleksi asli untuk dirangkai (selalu, sintaks apa pun adalah each dipanggil).

Anda sedang berbicara tentang casing khusus masing-masing sebagai bagian dari campuran, bukan?

Lebih sederhana dari itu. Hanya memiliki _.each kembali obj . Tidak perlu kasus khusus.

Tapi kemudian Anda melanggar spesifikasi. Bukan itu yang dilakukan each .

Tapi kemudian Anda melanggar spesifikasi. Bukan itu yang dilakukan each .

Saya sebelumnya menulis:

Saya tidak melihat apa pun yang mencegah Underscore membuat _ setiap rantai dapat dirantai. Itu rusak dengan semantik asli untuk metode lain.

Saya tidak melihat itu sebagai masalah besar. Garis bawahi bagian yang sudah ditentukan dengan perilaku yang ditentukan untuk kegunaan dev yang lebih baik dalam beberapa metode. Misalnya di edge _.keys(...) tidak ditampilkan jika argumen yang diberikan bukan objek, dan metode seperti _.every dan _.some berfungsi jika Anda tidak mengirimkan iterator .

Saya tidak berpikir ini adalah perubahan besar, tetapi pasti tidak terduga bahwa each akan mengembalikan apa pun, apalagi nilai yang diteruskannya (dan jeda spesifikasi yang jauh lebih besar daripada memeriksa argumen nullish).

Untuk lebih jelasnya, Anda sedang berbicara tentang membuat perubahan ini, bukan?

diff --git a/underscore.js b/underscore.js
index 7a30b0a..2b56536 100644
--- a/underscore.js
+++ b/underscore.js
@@ -74,7 +74,7 @@
   // Handles objects with the built-in `forEach`, arrays, and raw objects.
   // Delegates to **ECMAScript 5**'s native `forEach` if available.
   var each = _.each = _.forEach = function(obj, iterator, context) {
-    if (obj == null) return;
+    if (obj == null) return obj;
     if (nativeForEach && obj.forEach === nativeForEach) {
       obj.forEach(iterator, context);
     } else if (obj.length === +obj.length) {
@@ -87,6 +87,7 @@
         if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
       }
     }
+    return obj;
   };

Untuk lebih jelasnya, Anda sedang berbicara tentang membuat perubahan ini, bukan?

Baik.

Saya tidak terlalu peduli dengan satu atau lain cara tetapi akan lebih baik untuk mendengar dari lebih banyak orang tentang kasus penggunaan nyata yang mendukung atau menentang ini sebelum bergabung.

Saya pikir Anda bisa melakukannya. Akan sedikit lebih berguna.

Menurut pendapat saya setidaknya ketika bekerja dalam konteks yang dirantai, membuat _. Setiap mengembalikan nilai adalah perilaku yang diharapkan, jadi +1 :)

@LeonFedotov @ dw40 mencobanya.

@ akbar54 Mengagumkan.

@ akre54 bagus, terima kasih!

Menariknya, kami telah kembali ke perilaku sebelum 1.1.3.

Penambahan berikut ke catatan rilis 1.1.3 dibuat di 3b916a2cf788a4588f08323c39786b6fb5ddbca6:

_.each tidak lagi mengembalikan koleksi iterasi, untuk meningkatkan konsistensi dengan ECMA5 forEach .

Ha. Saya tahu itu tampak akrab. Tempat yang bagus.
Pada 1 Feb 2014 11:23 PM, "David Chambers" [email protected] menulis:

Menariknya, kami telah kembali ke perilaku sebelum 1.1.3.

Penambahan berikut untuk catatan rilis 1.1.3 dibuat di 3b916a2 https://github.com/jashkenas/underscore/commit/3b916a2cf788a4588f08323c39786b6fb5ddbca6
:

_.each tidak lagi mengembalikan koleksi yang diulang, untuk ditingkatkan
konsistensi dengan forEach ECMA5.

Balas email ini secara langsung atau lihat di Gi tHubhttps: //github.com/jashkenas/underscore/issues/1391#issuecomment -33883825
.

Apakah sekarang ada metode alternatif yang bisa dirantai dan memungkinkan modifikasi elemen array? Saya sedang mencari sesuatu seperti peek :

_.chain(myArray)
    ...
    .peek(e -> e.craftedVar = e.otherVar * 2)
    ...
    .value();
Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

githublyp picture githublyp  ·  3Komentar

acl0056 picture acl0056  ·  5Komentar

jezen picture jezen  ·  8Komentar

marcalj picture marcalj  ·  5Komentar

afranioce picture afranioce  ·  8Komentar