Я изучал реализацию объектов 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).