Underscore: _.السلسلة و _.الكل لا يلعبان معًا؟

تم إنشاؤها على ٢٩ ديسمبر ٢٠١٣  ·  27تعليقات  ·  مصدر: jashkenas/underscore

مرحبًا ، لست متأكدًا ولكني أعتقد أن هذا خطأ:

  _.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. 

أعتقد أن الوظيفة المقيدة يجب أن ترجع القيم ، لكن النقر ليس أمرًا متكررًا ، فأنا أبحث عن طريقة للوصول إلى القيم دون فك قيودها وبدون حدوث طفرة.

question

التعليق الأكثر فائدة

هل توجد الآن طريقة بديلة يمكن ربطها والسماح بتعديل عناصر مصفوفة في مكانها؟ كنت أبحث عن شيء مثل peek :

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

ال 27 كومينتر

هذا صحيح. على عكس map ، فإن each ليس له قيمة مرتجعة ، لذا فإن استدعاء value عليه لا يفعل شيئًا. إذا كنت بحاجة إلى تمرير مصفوفة متحولة عبر السلسلة ، فمن الأفضل الالتزام بـ map .

حسنًا ، خريطة ، ماذا عن _.chain (). انقر (الوظيفة (القيم) {القيم. forEach (الوظيفة (الحالية) {} ؛})
لا يبدو أنيقًا ولكنه يبدو منطقيًا ...

نعم ، تبدو جيدة بالنسبة لي:

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

سيكون من الجيد الإشارة إلى أن كل منها لا يُرجع قيمة في التوثيق.

يتبعxixixao each دلالات Array # forEach ، والتي لا تُرجع أيضًا أي قيمة. إذا كنت بحاجة إلى إرجاع شيء ما ، فما عليك سوى استخدام map .

لا أرى أي شيء يمنع Underscore من جعل _.each قابلًا للتسلسل. إنه يقطع مع الدلالات الأصلية للطرق الأخرى. هناك اختلافات طفيفة مع اقتراح _.map لأنه لا يُرجع نفس المصفوفة ويتطلب قيمة إرجاع في رد الاتصال.

لماذا يجب أن يكون كل منها قابلاً للتسلسل؟ أنت لا تقوم بتحويل المصفوفة بأي شكل من الأشكال (بالطريقة التي تتعامل بها مع شيء مثل الخريطة أو عامل التصفية) ، لذلك لا توجد توقعات بأن القيمة قابلة لإعادة الاستخدام.

لماذا يجب أن يكون كل منها قابلاً للتسلسل؟

لماذا لا تسمح بالسلاسل ، ما الذي يمكن أن يؤلم؟ إنه سهل الاستخدام في حالات مثل _(collection).each(intermediateActions).filter(...) .

سأجعل الطريقة غير معرّفة في سياق كائن ملفوف.

@ dw40 ولكن ماذا تفعل في تلك الإجراءات الوسيطة التي لا يمكن التعامل معها بشكل أفضل مع الخريطة؟

لكن ماذا تفعل في تلك الإجراءات الوسيطة التي لا يمكن التعامل معها بشكل أفضل مع الخريطة؟

لا يهم حقًا ما هي الخطوة الوسيطة ، فقد تكون عددًا من الأشياء ، وميزة تسلسل _.each هي أن رد الاتصال المتوسط ​​لا يجب أن يُرجع قيمة ولا يحتاج إلى إنشاء مجموعة جديدة.

@ dw40 تريد أن each كجزء من الخلط ، أليس كذلك؟

@ akre54 أعلم أن each يتبع forEach ، فأنا أعني حرفيًا أنه سيكون من الجيد ذكر السلوك في الوثائق.

ومع ذلك ، أوافق على أن كل واحد يجب أن يعيد المجموعة الأصلية للتسلسل (دائمًا ، مهما كانت الصيغة each يتم استدعاؤها مع).

أنت تتحدث عن غلاف خاص لكل جزء كجزء من الخلط ، أليس كذلك؟

أبسط من ذلك. فقط احصل على _.each return obj . لا حاجة لحالة خاصة.

لكنك بعد ذلك تتعارض مع المواصفات. هذا ليس ما يفعله each .

لكنك بعد ذلك تتعارض مع المواصفات. هذا ليس ما يفعله each .

لقد كتبت سابقًا:

لا أرى أي شيء يمنع Underscore من جعل _.each قابل للتسلسل. إنه يقطع مع الدلالات الأصلية للطرق الأخرى.

لا أرى في ذلك مشكلة كبيرة. أكد بالفعل على الأجزاء ذات السلوك المحدد لتحسين قابلية استخدام المطورين في عدة طرق. على سبيل المثال في edge _.keys(...) لا يتم طرحه إذا لم تكن الوسيطة التي تم تمريرها كائنًا ، وتعمل طرق مثل _.every و _.some إذا لم تنجح في تمرير iterator .

لا أعتقد أنه تغيير كبير ، لكن من غير المتوقع بالتأكيد أن each سيعيد أي شيء ، ناهيك عن القيمة التي تم تمريرها (وكسر مواصفات أكبر بكثير من التحقق من الحجج الفارغة).

لكي نكون واضحين ، أنت تتحدث عن إجراء هذا التغيير ، أليس كذلك؟

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;
   };

لكي نكون واضحين ، أنت تتحدث عن إجراء هذا التغيير ، أليس كذلك؟

حق.

لا أهتم بشكل خاص بطريقة أو بأخرى ، ولكن سيكون من الجيد أن أسمع من المزيد من الأشخاص حول حالات الاستخدام الحقيقي مع أو ضد هذا قبل الدمج.

أعتقد أنه يمكنك أن تفعل ذلك. سيكون أكثر فائدة قليلا.

في رأيي ، على الأقل عند العمل في سياق متسلسل ، فإن جعل _.كل إرجاع قيمة هو سلوك متوقع ، لذلك +1 :)

LeonFedotov @ dw40 جرب هذه المحاولة.

@ akre54 رهيبة.

@ akre54 عظيم ، شكرا!

ومن المثير للاهتمام أننا عدنا إلى سلوك ما قبل 1.1.3.

تم إجراء الإضافة التالية لملاحظات الإصدار 1.1.3 في 3b916a2cf788a4588f08323c39786b6fb5ddbca6:

لم يعد _.each يُرجع المجموعة المتكررة ، لتحسين التناسق مع ECMA5 forEach .

ها. كنت أعرف أنه يبدو مألوفًا. بقعة جيدة.
في 1 فبراير 2014 ، الساعة 11:23 مساءً ، كتب "David Chambers" [email protected] :

ومن المثير للاهتمام أننا عدنا إلى سلوك ما قبل 1.1.3.

تم إجراء الإضافة التالية لملاحظات الإصدار 1.1.3 في 3b916a2 https://github.com/jashkenas/underscore/commit/3b916a2cf788a4588f08323c39786b6fb5ddbca6
:

لم يعد _.each يقوم بإرجاع المجموعة المتكررة من أجل تحسينها
التوافق مع ECMA5 لكل منهما.

قم بالرد على هذه الرسالة الإلكترونية مباشرة أو tHubhttps: //github.com/jashkenas/underscore/issues/1391#issuecomment -33883825
.

هل توجد الآن طريقة بديلة يمكن ربطها والسماح بتعديل عناصر مصفوفة في مكانها؟ كنت أبحث عن شيء مثل peek :

_.chain(myArray)
    ...
    .peek(e -> e.craftedVar = e.otherVar * 2)
    ...
    .value();
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

afranioce picture afranioce  ·  8تعليقات

arieljake picture arieljake  ·  4تعليقات

danilopolani picture danilopolani  ·  5تعليقات

umarfarooq125 picture umarfarooq125  ·  8تعليقات

arypbatista picture arypbatista  ·  3تعليقات