Типы аргументов в функциях и функции стрелок в ES6 - PullRequest
0 голосов
/ 28 августа 2018

Я изучал реализацию объектов Set ES6 и то, как массив с дубликатами свернут в набор.

Я нашел это сравнение производительности , что само по себе интересно. Затем я хотел написать более короткую версию кода brettz9, которая выглядит так:

// https://gist.github.com/brettz9/6137753

function set (arr) {
  return arr.reduce(function (a, val) {
    if (a.indexOf(val) === -1) {
        a.push(val);
    }
    return a;
  }, []);
}

var l = [
   { date: '12/1/2011', reading: 3, id: 20055 },
   { date: '13/1/2011', reading: 5, id: 20053 },
   { date: '14/1/2011', reading: 6, id: 45652 }
];

var s = set(l);

Проблема, на которую я наткнулся, заключается в том, что я не смог разобраться в документации по функциям стрелок, почему следующий код не работает:

function set(a){a.reduce((s,o) => s.indexOf(o) === -1 ? s.push(o) : s);};
var s = set(l);

Возвращает ошибку типа (что, скорее всего, связано с тем, что среда выполнения не может определить, что s является массивом на первой итерации функции Reduce:

TypeError: s.indexOf не является функцией

Я не понимаю, как в приведенном выше фрагменте кода не возникает ошибка этого типа, так как на первой итерации функции Reduce нет объявления или типа "auto-cast", которые говорят, что a является Массив (и, следовательно, имеет определенную функцию indexOf).

1 Ответ

0 голосов
/ 28 августа 2018

Array.push изменяет массив на месте и возвращает новую длину массива. Это означает, что как только ваша троица попадает в эту ветвь, ваш объект-аккумулятор вместо этого превращается в число. Попробуйте вместо этого использовать Array.concat, чтобы объединить два массива и вернуть новый массив. Кроме того, в вашей версии функции стрелки отсутствует начальное значение для аккумулятора. Если вы не предоставите начальное значение, первый вызов вашего обратного вызова вызывается с первым и вторым значением из массива.

Попробуйте вместо этого:

function set(a){ return a.reduce((s,o) => s.indexOf(o) === -1 ? s.concat([o]) : s, []);};
var s = set(l);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...