Форум программистов, компьютерный форум, киберфорум
JavaScript
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
1

Удаление повторяющихся элементов массива в коде расширения Copy All Links для Firefox

13.09.2016, 20:49. Показов 933. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Друзья! Всё ли верно в этом коде? Он, я так понял, удаляет дубликаты из массива newArray

Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
CopyAllLinks.deleteDuplicateElementsInArray = function(arr) {
    var newArray = arr.concat(); // I guess this line copies arrays elements to a new array
    
    for(var i = 0; i < newArray.length; i++)
    {
        for(var j = i + 1; j < newArray.length; j++)
        {
            if(newArray[i] === newArray[j]) newArray.splice(j--, 1);
        }
    }
 
    return newArray;
};
+++++++++++++++++++++++++++++++++++++++++++++++++++++

Код не мой. Вот расширение Copy All Links для Firefox, оно копирует в буфер обмена строки-ссылки для со всех открытых вкладок. И когда ссылок много, порядка 6000, выводит стандартное сообщение, типа "похоже что сценарий на этой странице не отвечает, можно его остановить или продолжить" и всё такое. И выводит номер строку, где сценарий спотыкается. Эта строка 279 файла copyalllinks.js, а тут это строка

Javascript
1
if(newArray[i] === newArray[j]) newArray.splice(j--, 1);
По комментарию видно, что разработчик собрал все строки-ссылки в массив и теперь просто удаляет повторяющиеся строки из массива.

Я в яваскрипт не силён, я больше на плюсах; решил вот спросить, всё ли правильно в этом коде? Быть может, он просто ДОЛОГ и мне следует просто-напросто продолжать сценарий на странице? Спасибо, кто откликнется.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.09.2016, 20:49
Ответы с готовыми решениями:

Удаление расширения Антимат в firefox
Добрый день! История типичная, жена скачивала фильм и установила кучу сервисов от mail.ru Всё...

Создание расширения для Firefox. Перевод расширений Chrome на Firefox
Здесь обсуждается процесс создания расширений для Mozilla Firefox, а также портинг из Chrome. ...

Удаление из массива повторяющихся элементов
Значит,задача : удалить повторы в массиве, оставив по одному вхождению! моя идея. если 2...

Удаление повторяющихся элементов массива
Ребят, как можно вывести только неповторяющиеся элементы массива двумерного??? using System;...

10
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
13.09.2016, 21:47 2
Цитата Сообщение от kravam Посмотреть сообщение
var newArray = arr.concat(); /
просто выделяем "последовательно" память
Цитата Сообщение от kravam Посмотреть сообщение
for(var i = 0; i < newArray.length; i++)
* * {
* * * * for(var j = i + 1; j < newArray.length; j++)
такие конструкции говорят о проходе по двумерному массиву
Цитата Сообщение от kravam Посмотреть сообщение
if(newArray[i] === newArray[j]) newArray.splice(j--, 1);
в js это жесть - с массивами...

одним циклом for по массиву - зачем два?
2. имхо лучше и работать с объектом - смотря ключи какие...
если тысячи объектов, то ... и ключи строки - можно перенести алгоритм любого вида
в случае неповторения ключей у вас сложность квадратичная, по-сути, а, если вы постоянно шерстите...
оно как часто вызывается?
тут деревья нужны с гарантированным доступом к элементу и тогда мы получаем N*lgN, те уже красивее смотрится, но
мы же опять-таки поверх интерпетора (можно и предкомпилировать в jit-code)
короче швак полный с подобными АТД
сейчас вышли экпериментальные "коллекции элементов".
ему ток контент получай
опять-таки, учитывайте.

Добавлено через 9 минут
Цитата Сообщение от kravam Посмотреть сообщение
for(var i = 0; i < N; i++)
* * {
* * * * for(var j = i + 1; j < N; j++)
* * * * {
и воообще з Си, из Сэджвика энд Ко...
здесь нет очередей, нет деревьев, нет
в джаве надо под хэш затачивать имхо, опять-таки - таблицы хешей ключей массивов...
если только добавлять, удалять и тд... т.е. проверяться на равность уже при входе будет, причем за Const
причем Const меньше логарифмического в подавляющем.
поэтому, если JS, то пока нет утвержденных структур, то ... я сам новичок в JS...
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,679
13.09.2016, 22:41  [ТС] 3
Вообще говоря, я уже проблему решил так. Вместо функции пишу заглушку, получаю массив из 29000 строк в буфере обмена (приложение так и должно работать, оно запихивает все найденные строки ссылки в буфер обмена). Среди них много повторяющихся.

После чего вставляю эти строки в файл, ну а дальше дело техники. Удаляю дубликаты (на плюсах; можно в Notepad++, но он, помимо удаления повторяющихся строк их сортирует, что мне не нужно). Получаю 6000 строк-ссылок. Ровно столько же я получаю, если не пользуюсь заглушкой, то есть через яваскрипт. Но там минус- вылезает зачем-то сообщение.

Но хотелось бы вопрос-то добить уже. Можно как-то на яваскрипте сделать, чтобы это дурацкое сообщение не вылезало? Я так понял, код правилен, но работает долго (или памяти много жрёт, я не знаю.). Но задержка времени на мой взгляд, мала. Секунд 10 может. Не из-за чего беспокоиться. Ну покрутится цикл 10 секунд ничего страшного, на мой взгляд. Можно галку поставить "не показывать это сообщение", но хотелось бы покрасивее вопрос решить.
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
13.09.2016, 23:20 4
Так можно отсортировать в один проход
Javascript
1
2
3
4
5
6
CopyAllLinks.deleteDuplicateElementsInArray = function(arr) {
    var table = {};
    return arr.filter(function(a) {
        return !table[a] && (table[a] = 1);
    });
}
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
13.09.2016, 23:27 5
Цитата Сообщение от kravam Посмотреть сообщение
получаю массив из 29000 строк в буфере обмена
чего? какую заглушку? буфер обмена чего?
Цитата Сообщение от kravam Посмотреть сообщение
Получаю 6000 строк-ссылок.
и что вы сними делаете? надеюсь не на страницу сразу, онлайн выкладываете?

Добавлено через 5 минут
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
CopyAllLinks.deleteDuplicateElementsInArray = function(arr) {
* * var table = {};
* * return arr.filter(function(a) {
* * * * return !table[a] && (table[a] = 1);
* * });
}
если геометрия какая и размер не изменяется, те i, j фиксированы, то, для обновления, можно и циклом обычным и с вложенностью 2 можно... наверное, в таком случае array больше подойдет.
в случае работы с графикой нужен обычный массив.
мысли новичка.
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
13.09.2016, 23:31 6
Цитата Сообщение от SergioO Посмотреть сообщение
мысли новичка.
тогда ловите для тестирования
Javascript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Array.prototype.uniq = function () {
    for (var tmp = {}, len = this.length; len--; tmp[this[len]] = 1);
    return Object.keys(tmp);
};
 
Array.prototype.uniq = function () {
  var table = {};
  return this.filter((a)=> {
    return !table[a] && (table[a] = 1);
  });
};
 
Array.prototype.uniq = function () {
    for (var table = {}, i = 0, el; el = this[i], i < this.length; i++)
        table[el] ? this.splice(i--, 1) : (table[el] = 1);
    return this;
};
var arr = [1, 2, 3, 4, 4, 3, 2, 1];
console.log(arr.uniq());
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
13.09.2016, 23:44 7
Javascript
1
2
3
N=arr.length;
for(let i;i<N;i++){
arr[i]=...}
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
for (var tmp = {}, len = this.length; len--; tmp[this[len]] = 1);
for, tmp, len, this(!), len[this[len...
замудренно. так заикой останешься...
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
splice(i--, 1)
этой функции надо избегать - ооособенно в длинных циклах, хотя, если по ресурсам пофиг, то ...
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
13.09.2016, 23:55 8
Цитата Сообщение от SergioO Посмотреть сообщение
N=arr.length;
эт давно не обязательно, на некоторых тестах может отрабатывать больше по времени и неудобно по синтаксису так взял цикл и поставил куда надо, а еще лишняя переменная
Цитата Сообщение от SergioO Посмотреть сообщение
этой функции надо избегать - ооособенно в длинных циклах, хотя, если по ресурсам пофиг, то ...
вы не совсем поняли значение этой функции здесь изменится сам исходный массив
Javascript
1
2
var arr = [1, 2, 3, 4, 4, 3, 2, 1];
console.log(arr === arr.uniq()); // -> true
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
14.09.2016, 00:02 9
Javascript
1
var table = {};
let table = [];
имя массива объявить, если для графики и передать краткому циклу - см. выше
эт, самое эффективное, особенно если память выделять еще заранее и столько, чтобы потом delete ))
ладно хоть запускают SIMD - тож экспирементально.
так легко
...
SIMD.%type%.reciprocalSqrtApproximation()
SIMD.%type%.replaceLane()
SIMD.%type%.select()
SIMD.%type%.shiftLeftByScalar()
SIMD.%type%.shiftRightByScalar()
SIMD.%type%.shuffle()
SIMD.%type%.splat()
SIMD.%type%.sqrt()
SIMD.%type%.store()
...
0
Эксперт PHP
936 / 693 / 236
Регистрация: 01.02.2015
Сообщений: 1,848
14.09.2016, 00:16 10
Цитата Сообщение от SergioO Посмотреть сообщение
let table = [];
объявление переменнной ничего не даст если уже и лезть за новыми функциями то стоит расматривать
Map
или

Javascript
1
console.log(Array.from(new Set([1, 2, 3, 4, 4, 3, 2, 1])));

Set
0
260 / 208 / 99
Регистрация: 13.12.2015
Сообщений: 1,098
14.09.2016, 14:38 11
Цитата Сообщение от Fedor Vlasenko Посмотреть сообщение
объявление переменнной ничего не даст если уже и лезть за новыми функциями то стоит расматривать
Map
или
я об этом писал выше, но пока
Это экспериментальная технология, часть предложения Harmony (ECMAScript 6)
также как и SIMD
скоро, думаю, все будет...
0
14.09.2016, 14:38
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.09.2016, 14:38
Помогаю со студенческими работами здесь

Удаление из массива повторяющихся элементов
Как в массиве убрать одно из повторяющихся чисел??? тоесть дан массив 1,1,2,3,4,6,3,2,1 получить...

Удаление из массива повторяющихся элементов
Как удалить из массива повторяющиеся элементы?

Удаление повторяющихся элементов из упорядоченного массива
Как (не используя set) в отсортированном массиве удалить повторяющиеся элементы? Как проверить, что...

Сохранение строки в массив и удаление повторяющихся элементов массива
Нужно сделать так, что бы строка занасилась в массив без повтора элементов.(к примеру строка:...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru