Array.prototype.joinWith(iterable)

Jordan Harband ljharb at gmail.com
Fri Aug 16 20:00:07 UTC 2019


Can you elaborate a bit more on how this is a *common* case in the wider
ecosystem?

On Fri, Aug 16, 2019 at 5:29 AM Andrea Giammarchi <
andrea.giammarchi at gmail.com> wrote:

> early reply .... "which otehr cases"? this is just an example:
>
> [2019, 08, 16, 14, 28, 30].map(i => i < 10 ? ('0' + i) :
> i).joinWith('--T::.');
>
> On Fri, Aug 16, 2019 at 2:24 PM Andrea Giammarchi <
> andrea.giammarchi at gmail.com> wrote:
>
>> `this ${Symbol('throws')} an error`, so anything that cannot be
>> represented as string should throw too, as it is for `[1, 2,
>> 3].join(Symbol())`.
>>
>> In few words, everything described as parameter for the
>> `Array.prototype.join(param)` should be described as the iterable value,
>> nothng new to add, nothing different to expect.
>>
>> The template literal as is returns a string, but if you use tags, as
>> functions, you deal with an array and a collection or extra values (0 to
>> template.length - 1).
>>
>> The current way to flatten a template via tag, used already in various
>> projects for a reason or another, is the following one:
>>
>> ```js
>> function tag2str(template) {
>>   let str = template[0];
>>   for (let i = 1, t = template.length; i < t; i++)
>>     str += arguments[i] + template[i];
>>   return str;
>> }
>> ```
>>
>> I am proposing to simplify this common case with something that could be
>> used for other cases too.
>>
>>
>>
>>
>>
>> On Fri, Aug 16, 2019 at 1:17 PM Naveen Chawla <naveen.chwl at gmail.com>
>> wrote:
>>
>>> Cool.
>>>
>>> I get it now apart from the "templated string" example. I'm not very
>>> knowledgable about templated strings but on the face it looks like
>>> 'a${x}b${y}' already inserts x and y into the string, so I'm not sure what
>>> else is happening with your proposed method? Clearly I've missed something.
>>>
>>> Apart from that, how would you handle arrays that whose values are not
>>> all strings?
>>>
>>> For naming is still think "weave" would be OK from what I know so far
>>>
>>> On Fri, 16 Aug 2019 at 11:08, Andrea Giammarchi <
>>> andrea.giammarchi at gmail.com> wrote:
>>>
>>>> given an array, it joins it through the values of the iterable
>>>> argument, without ever resulting to undefined
>>>>
>>>> ['a', 'b', 'c'].joinWith(['-']) would produce "a-b-c"
>>>>
>>>> ['a', 'b', 'c'].joinWith([1, 2]) would produce "a1b2c"
>>>>
>>>> ['a', 'b', 'c'].joinWith('012') would produce "a0b1c"
>>>> note the string, as iterable, is acceptable too
>>>>
>>>> const tag = (template, ...values) => template.joinWith(values);
>>>> tag`a${Math.random()}b${Math.random()}`; would fill the gap between a
>>>> and b, or b and c, with the value returned by the two Math.random()
>>>>
>>>> ['a', 'b', 'c', 'd'].joinWith('01'); would produce "a0b1c0d" so that
>>>> there's never an `undefined
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Fri, Aug 16, 2019 at 12:01 PM Naveen Chawla <naveen.chwl at gmail.com>
>>>> wrote:
>>>>
>>>>> I'm just not seeing what it's supposed to do. If you could give a
>>>>> brief explanation of the array method, and the string method then of course
>>>>> I would get it. I know it would seem obvious to you from the examples
>>>>> alone, it's just not to me.
>>>>>
>>>>> On Fri, 16 Aug 2019 at 08:32, Andrea Giammarchi <
>>>>> andrea.giammarchi at gmail.com> wrote:
>>>>>
>>>>>> Just to re-state: zip from lowdash, does **not** do what my proposed
>>>>>> method does ... anything that won't produce the following result is not
>>>>>> what I'm proposing
>>>>>>
>>>>>> console.log(['a', 'b', 'c', 'd'].joinWith([1, 2]));
>>>>>> // a1b2c1d
>>>>>>
>>>>>> function tag2str(template, ...values) {
>>>>>>   return template.joinWith(values);
>>>>>> }
>>>>>>
>>>>>> tag2str`a${1}b${2}c`;
>>>>>> // "a1b2c"
>>>>>>
>>>>>> On Fri, Aug 16, 2019 at 5:57 AM Isiah Meadows <isiahmeadows at gmail.com>
>>>>>> wrote:
>>>>>>
>>>>>>> For that, I'd rather see an `interleave` that just rotates through
>>>>>>> all
>>>>>>> its arguments. It'd be basically sugar for `.zip().flat()`, but an
>>>>>>> implementation could optimize the heck out of it. (In particular,
>>>>>>> they
>>>>>>> could iterate through them one-by-one and only allocate once, not in
>>>>>>> the hot loop, so it'd be fast.)
>>>>>>>
>>>>>>> I at one point had it in my list of wishlist proposals, but it
>>>>>>> somehow
>>>>>>> disappeared. I've since recreated it:
>>>>>>>
>>>>>>> https://github.com/isiahmeadows/es-stdlib-proposals/blob/master/proposals/array/interleave.md
>>>>>>>
>>>>>>> -----
>>>>>>>
>>>>>>> Isiah Meadows
>>>>>>> contact at isiahmeadows.com
>>>>>>> www.isiahmeadows.com
>>>>>>>
>>>>>>>
>>>>>>> On Thu, Aug 15, 2019 at 1:12 PM Andrea Giammarchi
>>>>>>> <andrea.giammarchi at gmail.com> wrote:
>>>>>>> >
>>>>>>> > That;s not useful for template literals tags though
>>>>>>> >
>>>>>>> > _.zip(['a', 'b', 'c'], [1, 2]);
>>>>>>> > [["a", 1], ["b", 2], ["c", undefined]]
>>>>>>> >
>>>>>>> > it basically does nothing I've proposed ... any other name
>>>>>>> suggestion?
>>>>>>> >
>>>>>>> > On Thu, Aug 15, 2019 at 3:40 PM Michał Wadas <
>>>>>>> michalwadas at gmail.com> wrote:
>>>>>>> >>
>>>>>>> >> https://lodash.com/docs/#zip
>>>>>>> >> https://docs.python.org/3/library/functions.html#zip
>>>>>>> >>
>>>>>>> >> On Thu, 15 Aug 2019, 15:34 Andrea Giammarchi, <
>>>>>>> andrea.giammarchi at gmail.com> wrote:
>>>>>>> >>>
>>>>>>> >>> the suggested name is just ... suggested, I don't have strong
>>>>>>> opinion on it, it just `join` values through other values
>>>>>>> >>> what's `Array.zip` ? I've no idea
>>>>>>> >>>
>>>>>>> >>>
>>>>>>> >>> On Thu, Aug 15, 2019 at 12:53 PM Michał Wadas <
>>>>>>> michalwadas at gmail.com> wrote:
>>>>>>> >>>>
>>>>>>> >>>> I would rather see Array.zip, it covers this use case.
>>>>>>> >>>>
>>>>>>> >>>> On Thu, 15 Aug 2019, 10:50 Andrea Giammarchi, <
>>>>>>> andrea.giammarchi at gmail.com> wrote:
>>>>>>> >>>>>
>>>>>>> >>>>>
>>>>>>> >>>>> I wonder if there's any interest in adding another handy Array
>>>>>>> method as joinWith could be:
>>>>>>> >>>>>
>>>>>>> >>>>> ```js
>>>>>>> >>>>> // proposal example
>>>>>>> >>>>> Array.prototype.joinWith = function (values) {
>>>>>>> >>>>>   const {length} = this;
>>>>>>> >>>>>   if (length < 2)
>>>>>>> >>>>>     return this.join('');
>>>>>>> >>>>>   const out = [this[0]];
>>>>>>> >>>>>   const len = values.length;
>>>>>>> >>>>>   for (let i = 1; i < length; i++) {
>>>>>>> >>>>>     console.log(i, len);
>>>>>>> >>>>>     out.push(values[(i - 1) % len], this[i]);
>>>>>>> >>>>>   }
>>>>>>> >>>>>   return out.join('');
>>>>>>> >>>>> };
>>>>>>> >>>>> ```
>>>>>>> >>>>>
>>>>>>> >>>>> The goal is to simplify joining array entries through not the
>>>>>>> same value, example:
>>>>>>> >>>>>
>>>>>>> >>>>> ```js
>>>>>>> >>>>> console.log(['a', 'b', 'c', 'd'].joinWith([1, 2]));
>>>>>>> >>>>> // a1b2c1d
>>>>>>> >>>>>
>>>>>>> >>>>> function tag2str(template, ...values) {
>>>>>>> >>>>>   return template.joinWith(values);
>>>>>>> >>>>> }
>>>>>>> >>>>>
>>>>>>> >>>>> tag2str`a${1}b${2}c`;
>>>>>>> >>>>> // "a1b2c"
>>>>>>> >>>>> ```
>>>>>>> >>>>>
>>>>>>> >>>>> Throughts?
>>>>>>> >>>>> _______________________________________________
>>>>>>> >>>>> es-discuss mailing list
>>>>>>> >>>>> es-discuss at mozilla.org
>>>>>>> >>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>>> >
>>>>>>> > _______________________________________________
>>>>>>> > es-discuss mailing list
>>>>>>> > es-discuss at mozilla.org
>>>>>>> > https://mail.mozilla.org/listinfo/es-discuss
>>>>>>>
>>>>>> _______________________________________________
>>>>>> es-discuss mailing list
>>>>>> es-discuss at mozilla.org
>>>>>> https://mail.mozilla.org/listinfo/es-discuss
>>>>>>
>>>>> _______________________________________________
> es-discuss mailing list
> es-discuss at mozilla.org
> https://mail.mozilla.org/listinfo/es-discuss
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.mozilla.org/pipermail/es-discuss/attachments/20190816/e771a162/attachment.html>


More information about the es-discuss mailing list