Комментарии 29
Дождались, аллилуйя. После изучения скалы, мне всегда не хватало flatMap в яваскрипте.
менять прототайп массива — не круто, чревато проблемами в будущем.
Ну вот написал я свое расширение flatMap, а тут разработчики браузеров втащили кривую библиотеку с другой реализацией flatMap.
Сделать их идентичными не так просто из-за заранее неизвестных соглашений об обработке "необычных" типов.
Какими?
Например тем, что вы напишите функцию flat для бесконечной вложенности, а в стандарт войдет реализация только для первого уровня вложенности, и весь ваш код сломается после обновления браузеров.
https://developers.google.com/web/updates/2018/03/smooshgate
Array.prototype.flat = MyFlatFunction;
То после реализации и вхождения в стандарт — всё будет работать как и раньше, никакой код не сломается. Максимум — не будет ускоренной нативной реализации и отлетит сторонний код который положится на реализацию вошедшую в стандарт.
Но расширение прототипов — больно удобная фича чтоб её не использовать в своих проектах где целиком отвечаешь за весь код.
отлетит сторонний код который положится на реализацию вошедшую в стандарт.
Вот именно это и плохо. Если у пользователя перестанет открываться сайт, ему неважно, ваш это был код, или сторонний.
По мне так допустимо только два способа расширения прототипов: либо явные полифилы для старых браузеров, когда стандартная спецификация уже устаканилась, либо, ну если уж очень хочется своих красивостей, то только с myvendorprefix_ (типа mycool_flatMap).
Вообще-то, в вашем оригинальном пожелании нет ни слова о прототипе :)
Подправьте статью, данное предложение больше не является кандидатом (стадия 3)
github.com/tc39/proposal-flatMap
На ряде чисел.- не понятна суть этого улучшения. В чем польза?
Ну вот, один из моих любимых FizzBuzz-подобных вопросов испортили. :-)
С другой стороны, если кандидат знает такие новшества, это хороший признак, и всегда можно попросить написать без flat().
const ar = [[1,2],[3,4],[5,6]];
ar.reduce((a,b)=>[...a,...b]);
//[1,2,3,4,5,6]
Это если вложенные элементы — гарантированно массивы, конечно. Если нет, тоar.reduce((a, b) => [...a, ...(Array.isArray(b) ? b : [b])]);
Еще короче
[].concat(...arr)
ECMAScript Proposal: Array.prototype.{flat,flatMap}