Pull to refresh

Comments 40

Помимо того, что почти половина "трюков" заключается в использовании стандартных и вполне себе известных методов массивов вроде reverse() и splice(), статья ещё и вводит некоторые сомнительные ограничения вроде — как трансформировать массив без map(). Зачем? Какое у from() преимущество, кроме менее лаконичной записи? Чем не угодили concat(), который работает быстрее спреда и для более чем двух массивов опять же позволяет получить более короткую запись?)

Перечитайте первый абзац еще раз. Эта статья рассчитана на новичков в программировании, которые, возможно, еще не знают все стандартные и известные методы. Да и метка стоит «beginners». Я не автор, я просто перевел ее)

Зря вы выбрали именно эту статью. Скажем там в одном из примеров O(n^2) там где хватит O(n). Зачем такому учить новичков? Метод .reduce описан чуть менее чем никак, просто "магия". Вообще не упомянуто про то, что .reverse и .sort мутируют массив (и даже даётся ложная иллюзия того, что это не так, за счёт присваивания значения новой переменной). Вообще статья попахивает, если честно.

Согласен с Вами. Надо ответственнее подходить к выбору статьи для переводов, я это понял на своем опыте)
Зачем? Какое у from() преимущество, кроме менее лаконичной записи?

Он работает с итерируемыми обектами, не являющимися массивами и соответственно не имеющими метода map. Например DOM API возвращает всё что угодно, но не массивы, к сожалению.

Вы правы. Жаль только это в комментариях, а не в статье)

Он работает с итерируемыми обектами

Не только с итерируемыми, но и с массивоподобными. Например {length:3}
UFO just landed and posted this here
const numOne = [0, 2, 4, 6, 8, 8];
const numTwo = [1, 2, 3, 4, 5, 6];
const duplicatedValues = [...new Set(numOne)].filter(item => numTwo.includes(item));
console.log(duplicatedValues); // вернет [2, 4, 6]


Автор охренел? Нахрена было создавать набор, если потом всё равно проверяем includes в массиве?

const numOne = [0, 2, 4, 6, 8, 8];
const numTwo = [1, 2, 3, 4, 5, 6];
const mySet = new Set(numOne);
const duplicatedValues = numTwo.filter(value => mySet.has(item));
Только всё-же лучше два набора, чтобы исключить дублирование элементов из numTwo. Ваш код, если поправить опечатки, в отличие от оригинала, для
const numOne = [0, 2, 4, 6, 8, 8];
const numTwo = [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1];

заполнит duplicatedValues так: [ 2, 4, 6, 4, 2 ]
Вариант с двумя наборами:
const numOne = [0, 2, 4, 6, 8, 8];
const numTwo = [1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 1];
const mySet = new Set(numOne);
const duplicatedValues = [...new Set(numTwo.filter(item => mySet.has(item)))];
console.log(duplicatedValues); // вернет [2, 4, 6]

Ну или вначале из numTwo сделать набор.
Для больших массивов можно сравнить количество элементов в mySet и numTwo, и на основании этого использовать либо первый вариант, либо второй.

Согласен, явно этого сказано не было. Только решение, которое вы предлагаете, может давать разные результаты, если поменять местами входные массивы. Как-то несолидно, не находите?
В оригинале написано «Find the intersection of two arrays». И в этом случае, операция пересечения множеств коммутативна. Зачем было переводить как «Как найти общие элементы двух массивов» непонятно.
Это мой косяк, спасибо за замечание, поправлю. Я посчитал, что «общие элементы» звучит понятнее, чем «пересечение». Но в итоге получился немного другой смысл.
Я на полминуты завис от слова «набор». Множество же.
прошу прощения за нубский вопрос, я не спец в JavaScript. Хотел спросить по поводу объектов. Таки в JavaScript словарь называется объектом, или это особенности перевода?
Простите, какой язык Вам родной? Просто не вполне понятно, что Вы называете словарём.
python.
А словарем я называю то, что получают в 5 совете:
{0: 'banana', 1: 'apple', 2: 'orange', 3: 'watermelon', 4: 'apple', 5: 'orange', 6: 'grape', 7: 'apple'}
Ну, если пользоваться терминологией питона и сильно упрощать, то можно сказать, что в JS любой объект — словарь. При этом объектом, в смысле ООП он быть не перестаёт.
хм, ну еще мне близок C++ с его ассоциативными массивами, те же словари, но чтобы даже с конструктором — это словарь, интересно конечно. Спасибо за пояснение
Добавлю, что объект в JavaScript похож на «классический » словарь (std::map в c++) методами доступа к полям (в JavaScript они называются свойствами — properties), но всё-же словарём не является. Есть ограничения/тонкости. Хотя, до появления Map, объекты часто использовались в качестве словарей с известными ограничениями.
да, аналогию с map понял, спасибо. Все равно хотел когда-то начать знакомиться с JS, видимо пора начать :)

Скорее всего вы имели в виду std::unordered_map

да, интересно автоматическое приведение типа, ох… Спасибо, почитаю подробнее
В пятом совете в итоге получится объект
{ '0': 'banana', '1': 'apple', '2': 'orange', '3': 'watermelon', '4': 'apple', '5': 'orange', '6': 'grape', '7': 'apple' }
. То-есть, числовые ключи преобразуются в строки. Кстати, в оригинале та же неточность.
да, по ответу printf понял, что ключи приводятся к строке, я копировал пример из статьи
4. Чем это отличается от arr = []? Вообще не представляю нафига усложнять этот пример до написания лишнего lenght.
5 и 8 — это спасибо спреду скажите, лучше бы пример на ES5 дали.
А, ну и пример с использованием мат.рандом вообще банальность дикая, как по мне.

Это больше на шпаргалку по языку «для себя» похоже, чем на статью для хабра, уж извините.
Какая мне разница что там изменится по ссылке, если меня волнует, в первую очередь, на что указывает указатель?

It depends. Зависит от задачи. Если на ваш массив уже есть где-то другие ссылки, и вы желаете чтобы они всё также вели на актуальный набор данных, то вам очень даже важно ничего не поломать.

Если на мой массив где-то есть другие ссылки, с какой целью мне понадобится делать ему lenght = 0 и сохранять при этом содержимое?

Приведите не синтетический пример.
с какой целью мне понадобится делать ему lenght = 0

дабы обеспечить консистентность данных при обнулении коллекции.


Приведите не синтетический пример

Вы же пишете, что у вас 10+ лет опыта в программировании. Это такой троллинг?

Ещё раз, зачем мне обеспечивать некую консистентность данных, если я, по сути, обнуляю массив.

Это такой троллинг?

Вы либо сами запутались в чуши, которую пишете, либо не в состоянии собственные заявления аргументировать.

Хорошо, на этом и порешим.

Согласен, материал, возможно, не самый интересный и востребованный. Я просто увидел количество положительных комментариев под оригинальным постом и подумал, что перевести не самая плохая идея. Если хоть одному человеку этот перевод окажется полезным, я буду рад.

Дружище, ну хоть вычитай то, что написал. Как «пере» массив, как полуь массив, это же позор.

Спасибо за замечание :) Я использую гугл-расширение Multi-higlight, которое подсвечивает внесенные в список слова. В этом списке в том числе есть слова «вам», «чит», «вернуть», «очен». И похоже из-за этого расширения при редактировании статьи подсвеченные слова были выброшены из текста. В общем, нашелся интересный баг)
Sign up to leave a comment.

Articles