Array concatenation based on the length

Bug in our code

Recently I encountered a weird bug in the code. When we are aggregating data, we were then combining the results in the single array. And as almost everywhere in the code, we were using the array.concat(...array2) function to do it. We use this because it is better to return new value, compared to the changed of existing one? I think it is an idea from functional programming?

But then there was a case, when this did not work. Running it locally, I got the following message:

Caught Unhandled Promise Rejection: RangeError: Maximum call stack size exceeded

Now, I have never encountered the call stack size error in the JavaScript. but I did it in Python, when I wrote the recursion as the infinite loop.

Concat (original - didn't work)

Checking the Ecma Standard documentation for concat, it seems that if array is spreadable, there is a repetition there, where it is not defined, if it is a for loop or recursion. Recursion could cause this problem.

Let O be ? ToObject(this value).
2. Let A be ? ArraySpeciesCreate(O, 0).
3. Let n be 0.
4. Prepend O to items.
5. For each element E of items, do

    a. Let spreadable be ? IsConcatSpreadable(E).
    b. If spreadable is true, then
        i. Let k be 0.
        ii. Let len be ? LengthOfArrayLike(E).
        iii. If n + len > 253 - 1, throw a TypeError exception.
        # this part is most likely the problematic part
        iv. Repeat, while k < len,
            1. Let P be ! ToString(𝔽(k)).
            2. Let exists be ? HasProperty(E, P).
            3. If exists is true, then
                a. Let subElement be ? Get(E, P).
                b. Perform ? CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), subElement).
            4. Set n to n + 1.
            5. Set k to k + 1.
    c. Else,
        i. NOTE: E is added as a single item rather than spread.
        ii. If n253 - 1, throw a TypeError exception.
        iii. Perform ? CreateDataPropertyOrThrow(A, ! ToString(𝔽(n)), E).
        iv. Set n to n + 1.

6. Perform ? Set(A, "length", 𝔽(n), true).
7. Return A.

Based on the testing this case (a bit over 150.000 array list and empty list), this only happens if the longer array is added the the empty array -> which in our case happens, since this the the first result added to the final results. If the order is reversed, so empty array is added to the longer one, the error does not appear.

But reversing the order in this case would not work, since I would still be adding the too long one in the next step of the for loop. So I tested some of the other syntax.

Push (didn't work)

Using the array1.push(...array2) syntax has the same error. Even though the Ecma Standard documentation for push does not seems to have the same recursion. It only has the for loop. Maybe it is a NodeJS implementation then.

Let O be ? ToObject(this value).
2. Let len be ? LengthOfArrayLike(O).
3. Let argCount be the number of elements in items.
4. If len + argCount > 253 - 1, throw a TypeError exception.
5. For each element E of items, do
    a. Perform ? Set(O, ! ToString(𝔽(len)), E, true).
    b. Set len to len + 1.
6. Perform ? Set(O, "length", 𝔽(len), true).
7. Return 𝔽(len).

Spread (worked)

On the other hand, the spread syntax [...array1, array2] did work. At least this place now no longer have any problems anymore. Not sure what this one worked, though...

給料を上げるために、どうして新しい仕事を見つけなくていけないのか?

スロベニアに、多分ヨーロッパ全体にも、そんな変なことは普通だよ。会社は会社員は給料を上げる時に、そんなに聞いていない。聞いて欲しいなら、他の会社を受けてできる仕事の証拠が必要だ。

友人は今その為に会社を申し込む。

短い時間を考えるだけなら、経済的には、それは意味がある。人は同じ給料は働きたいなら、もっと高いを払うなら、金を無駄遣いだけだ。

でもそれは短い時間だけだ。

私、先週で、1:1会議があった。そんな会議は一月一度上司と話す。そんな会議で、私の給料を話した。何ヶ月前に、私の会社は各仕事で給料の上と下のリミットを発表した。私の給料はその下に届けない。そして今月でその下の上で上がった。

私はどうでもいい、それも伝えた。けど、私の上司はそれはフェアじゃないだから、自分のためにやらせた(大変だと聞いただけ)。そしてそんな「どうでもいい」判断は他の人と違って、変ですよ。

他に人はそれを見ているなら、フェアじゃない、他の仕事を探すかも知れない。少なくとも、反応はんし普通で働かない。

そんな人達は、周りの人の給料を見て、他の仕事も探すよの。

そんな申し込むの演技は時間を使われたくない。そんな時間には意味があるなのか?世界とか私の生活はこれが上がるのか?無駄時間を使われるだけだ。金の為だけそんな事を。。。

会社には長い時間に考えるなら、そんな良い取引ではないよ。

一番の理由は会社員の時間と会社の金は使わなければならない。人の探すのはそれしかないだよ。

でももっと大事な理由は知識と想像力だ。

今日、私は経済大学に従業を聞いていた。タイトルはThe strategic value and challenges of configurational meta-knowledge in creative industries.

新しい料理を想像を兼kずうしてきたけど、想像力の必要な仕事に使えできるイデアがあった。

想像力の為に、一番大事なものは組織の感覚だ。それはその組織にどんな料理はいいのか、悪いのか、の判断だ。料理は他の場所でいいとでも、その場所にも悪いかも知れない。想像は場所と時間と関わる人と考えるだけに、良いとか悪いとか判断出来る。

だからそんな勘をを与えるまでに、良い新作は多作らない。

試すにはいいよ。そんな方法でその勘を育てる事が出来る。組織に長い時間の間の人の判断を聞いては必用だけど。それは組織に似合いとか似合わないとか学んでことが出来る。

それは何ヶ月に時間がかかる。それは新しいの仕事を学んだ後の話だ。

そんな勘があるなら、良い新作は知識(料理の味からどんなものは入るは判断出来る)と技(料理の作り方:焼きとかふかすとか。。。)の問題だ。

良い人を見つけるなら、そんな育てるには支払いは必用ないのは確かに。けど、皆はそう思ったなら、新しい人は始まれることが出来ない。だたか、人は足りないで、給料は高いになる。

プログラマーには、それはもう見える。新しいには誰は育てることは欲しくない。仕事は変わるんですから、時間は初心者には使えたくない。皆は上手の者が欲しい。育てるには必用ないから。だから、給料はそんなに高くだよ。

でも話なら、それは見ていないとか、それは大問題がしているでも、どうするとか知らないだけか。

仕事は金のために変わる事は必要にならないなら、そんな上の問題にも少しでも解決ことが出来る?