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.
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 ECMA5forEach
.
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();
Komentar yang paling membantu
Apakah sekarang ada metode alternatif yang bisa dirantai dan memungkinkan modifikasi elemen array? Saya sedang mencari sesuatu seperti
peek
: