Форум программистов, компьютерный форум, киберфорум
JavaScript для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
1 / 1 / 0
Регистрация: 10.02.2014
Сообщений: 98

Удаление дублей в массиве

24.05.2018, 12:13. Показов 4180. Ответов 41
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите скриптом, который бы убирал дубли в массиве.
Массив представляет собой список фамилий и номеров их очередей.
Если есть одинаковые фамилии, то повторные (с большим номером очереди) убрать из массива. Как следствие убрать соответствующий фамилии и номер очереди (с уменьшением номера оставшихся если появился пропуск в номерах).
Возможные варианты и ожидаемый результат обработки

A,1,A,2,B,3,C,4 =-> A,1,B,2,C,3

A,1,B,2,A,2,C,3 =-> A,1,B,2,C,3

A,1,A,1,B,2,C,3 =-> A,1,B,2,C,3

A,1,B,2,A,3,C,4 =-> A,1,B,2,C,3

A,1,B,2,C,3,A,4 =-> A,1,B,2,C,3
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.05.2018, 12:13
Ответы с готовыми решениями:

Удаление текста после ALT+Enter либо удаление дублей в массиве
подзадача заключается в том, чтобы после определенного символа в моем случае это "ALT+Enter" удалить все слова внутри ячейки....

Удаление дублей в массиве
Помогите, пожалуйста.:wall: Берем два столбца с листа, записываем их в массив, и нужно очистить этот массив от дублей. Как это...

Удаление дублей
Как с наименьшей трудоемкостью удалить дубли из таблицы InterBase. Т.е. имеем пары строк с совершенно одинаковыми данными - надо из этой...

41
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
28.05.2018, 16:51
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от ALARMus75 Посмотреть сообщение
При компиляции не понимает такие конструкции как: =>
Надо заменить на обычные фукнции
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
        Array.prototype.zip = function (scnd)
        {
            return this.map(function (v, i) { return [v, scnd[i]]; });
        }
 
        Array.prototype.unzip = function ()
        {
            return [this.map(function (v) { return v[0]; }), this.map(function(v){return v[1]; })];
        }
 
        var M1 = ["A"];
        var M2 = [["A", "B", "C"], ["A", "B", "C"], ["B", "A", "C"], ["B", "A", "C"], ["B", "A", "C"], ["B", "C", "A"], ["B", "C", "A"], ["B", "C", "D"], ["B", "B", "C"], ["B", "A", "B", "C"]];
        var M3 = [[2, 3, 4], [2, 2, 3], [2, 3, 4], [2, 2, 3], [2, 3, 3], [2, 3, 3], [2, 3, 4], [2, 3, 4], [2, 3, 4], [2, 3, 4, 4]];
 
        var M23 = M2.zip(M3).map(function(v)
        {
            let vf = v[0].filter(function (vv, i, a) { return M1.indexOf(vv) < 0 && a.indexOf(vv) == i });
            return [vf, v[1].slice(0, vf.length)]
        }).filter(function (v) { return v[0].length > 0; }).unzip();
        console.log(M23);
По поводу остального: я правильно понимаю - берем самую меньшую очередь и для всех оставшихся участников группы увеличить для каждого на единицу? А как это согласуется с другими группами?
Цитата Сообщение от ALARMus75 Посмотреть сообщение
(исключение когда удаленный элемент повторялся - 2,2,3 <- удаляется вторая 2-ка и на ее место встает 3-ка)
То что написано перед этим - понятно. А вот с исключениями требуются некоторые подробности. Вот допустим есть такая пара
ABCD 2223
Удаляем из первого массива A. Как должен измениться список? 223 или 222. То есть у D меняется очередь и он занимает освободившуюся двойку, или надо принять во внимание, что двоек и так достаточно и оставить его на тройке?
1
1 / 1 / 0
Регистрация: 10.02.2014
Сообщений: 98
28.05.2018, 17:01  [ТС]
Цитата Сообщение от diadiavova Посмотреть сообщение
ABCD 2223
Удаляем из первого массива A. Как должен измениться список? 223 или 222. То есть у D меняется очередь и он занимает освободившуюся двойку, или надо принять во внимание, что двоек и так достаточно и оставить его на тройке?
Логика в том, чтобы относительная очередь должна остаться.
Т.е. в этом случае D имеет очередь следующую после A,B,C - так и должен остаться в очереди после них. Поэтому в результате будет 2,2,3.
Это так сказать бизнес логика. А как её в логику кода преобразить - я так понимаю смотреть есть ли у удаляемого элемента такой же номер очереди у предыдущего или последующего элемента - если да, то у оставшихся элементов цифры очереди не меняются.


let vf = v[0].filter(function (vv, i, a) { return M1.indexOf(vv) < 0 && a.indexOf(vv) == i });

ERROR SyntaxError: missing ; before statement на символе 17.(выделена жирным)
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
28.05.2018, 17:08
ALARMus75, Ладно, другой вариант: очереди распределены так 22334. Одну надо удалить, что удаляем двойку или тройку?

Добавлено через 1 минуту
Цитата Сообщение от ALARMus75 Посмотреть сообщение
ERROR SyntaxError: missing ; before statement на символе 17.(выделена жирным)
Видимо таки let надо на var заменить.

Добавлено через 3 минуты
Цитата Сообщение от diadiavova Посмотреть сообщение
очереди распределены так 22334
Не тут четверку. 2233 что удаляем?
0
1 / 1 / 0
Регистрация: 10.02.2014
Сообщений: 98
28.05.2018, 17:09  [ТС]
Компилирует нормально, но при выполнении

строка 3: ERROR TypeError: this.map is not a function на символе 1.

Строка 3 это -> return this.map(function (v, i) { return [v, scnd[i]]; });
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
28.05.2018, 17:18
ALARMus75, возможно действительно мэп не поддерживается в твоей версии. Можно добавить таким же способом. Вначале скрипта добавь следующий код
JavaScript
1
2
3
4
5
6
7
8
9
        Array.prototype.map = function (fn)
        {
            var result = [];
            for (var i = 0; i < this.length; i++)
            {
                result.push(fn(this[i], i, this));
            }
            return result;
        }
Есил после этого на мэп перестанет ругаться и начнет ругаться на filter, тогда добавим еще фильтер.

Добавлено через 1 минуту
В принципе фильтер можно определить так
JavaScript
1
2
3
4
5
6
7
8
9
10
        Array.prototype.filter = function (fn)
        {
            var result = [];
            for (var i = 0; i < this.length; i++)
            {
                if (fn(this[i], i, this))
                    result.push(this[i]);
            }
            return result;
        }
0
1 / 1 / 0
Регистрация: 10.02.2014
Сообщений: 98
28.05.2018, 17:25  [ТС]
Цитата Сообщение от diadiavova Посмотреть сообщение
Ладно, другой вариант: очереди распределены так 22334. Одну надо удалить, что удаляем двойку или тройку?
Удаляем не те значения которые равны в массиве очереди (с цифрами), а те значения, которые равны в массиве с фамилиями и соответствующие им (фамилиям) значения в очередях.

Так если соответствие такое (памятуя, что в M1 содержится: A):
M2=ABCDE
M3=22334
то удаляем из М2 первый элемент - А и соответствующий ему первый элемент в М3, то получим

М2=BCDE
M3=2334

Если же изначально
М2=ABCBE
M3=22334
Получим

М2=BCE
M3=234
т.е. следуя принципу оставления последовательности очереди: С должна стоять в очереди после А и В
======================

Во аналогия:
Стоит очередь, стали проверять и выяснилось что Петров стоит в очереди в двух местах (2 раза занял), оставить за Петровым только меньший номер очереди, а из остальных его убрать. После того как Петрова убрали из очереди (где он зафиксирован 2-й и более раз) оставшаяся очередь смыкается занимая освободившиеся места.

Но бывает что вместе пришли 2 друга Иванов и Сидоров и встали вместе, а не друг за другом (заняли один номер очереди).
Прошла такая же проверка и выяснилось, что Сидоров еще в другом месте очереди занимал (один без Иванова) где-то впереди. И вот его дублирующее присутствие в очереди убрали (то что позднее, где он вместе с Ивановым) - при этом очередь не сдвигается - Иванов же на этом месте очереди остался.
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
28.05.2018, 18:33
Цитата Сообщение от ALARMus75 Посмотреть сообщение
Во аналогия:
Эта аналогия все запутывает еще больше.
Цитата Сообщение от ALARMus75 Посмотреть сообщение
Если же изначально
М2=ABCBE
M3=22334
Получим
М2=BCE
M3=234
То есть мы удаляем участника, соответствующую ему очередь и если в очередности появились дыры, то все что впереди уменьшаем так чтобы дыры заполнились? То есть если после удаления осталось 1256, то надо сделать 1234 что ли?

Добавлено через 57 минут
ALARMus75, если так как выше написал, то есть дыры заделываются путем понижения номеров у всех кто после дыры, то это будет выглядеть так
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
        Array.prototype.map = function (fn)
        {
            var result = [];
            for (var i = 0; i < this.length; i++)
            {
                result.push(fn(this[i], i, this));
            }
            return result;
        }
 
        Array.prototype.filter = function (fn)
        {
            var result = [];
            for (var i = 0; i < this.length; i++)
            {
                if (fn(this[i], i, this))
                    result.push(this[i]);
            }
            return result;
        }
 
        Array.prototype.find = function (fn)
        {
            for (var i = 0; i < this.length; i++)
            {
                if (fn(this[i], i, this))
                    return this[i];
            }
            return null;
        }
        Array.prototype.findIndex = function (fn)
        {
            for (var i = 0; i < this.length; i++)
            {
                if (fn(this[i], i, this))
                    return i;
            }
            return -1;
        }
 
        Array.prototype.zip = function (scnd)
        {
            return this.map(function (v, i) { return [v, scnd[i]]; });
        }
 
        Array.prototype.unzip = function ()
        {
            return [this.map(function (v) { return v[0]; }), this.map(function (v) { return v[1]; })];
        }
 
        var M1 = ["A"];
        var M2 = [["A", "B", "C"], ["A", "B", "C"], ["B", "A", "C"], ["B", "A", "C"], ["B", "A", "C"], ["B", "C", "A"], ["B", "C", "A"], ["B", "C", "D"], ["B", "B", "C"], ["B", "A", "B", "C"]];
        var M3 = [[2, 3, 4], [2, 2, 3], [2, 3, 4], [2, 2, 3], [2, 3, 3], [2, 3, 3], [2, 3, 4], [2, 3, 4], [2, 3, 4], [2, 3, 4, 4]];
 
        var M23 = M2.zip(M3).map(function (v)
        {
            var v23 = v[0].zip(v[1]).filter(function (vv, i, a)
            {
                return M1.indexOf(vv[0]) < 0 && a.findIndex(function (x) { return x[0] == vv[0] }) == i;
            }).unzip();
            console.log(v23);
            var wi;
            var holeFndr = function (vv, ii, aa) { return (vv - aa[ii - 1]) > 1; }
            while ((wi = v23[1].findIndex(holeFndr)) > -1)
            {
                for (var i = wi; i < v23[1].length; i++)
                {
                    v23[1][i]--;
                }
            }
            return v23;
        }).filter(function (v) { return v[0].length > 0; }).unzip();
        console.log(M23);
Добавил там find(по-моему не использовался) и findIndex, опять-таки на случай, если в использованной тобой версии языка их нет. Если есть, то можно убрать.
0
1 / 1 / 0
Регистрация: 10.02.2014
Сообщений: 98
29.05.2018, 11:08  [ТС]
Цитата Сообщение от diadiavova Посмотреть сообщение
То есть если после удаления осталось 1256, то надо сделать 1234 что ли?
Верно, т.е. те кто был вместе в очереди (с одним номером) так и должны остаться вместе и конечная нумерация должна идти по возрастанию от 2. (осталось после удаления - 2446 - надо сделать 2334)

=======

JavaScript
1
2
3
4
            var v23 = v[0].zip(v[1]).filter(function (vv, i, a)
            {
59-я                return M1.indexOf(vv[0]) < 0 && a.findIndex(function (x) { return x[0] == vv[0] }) == i;
            }).unzip();
строка 59: ERROR TypeError: M1.indexOf is not a function на символе 1.

Добавлено через 36 минут
Я проанализировал логику по удалению и перенумерации элементов в массиве M3.
Получается 3 условия:
Если удаляемый элемент массива (т.е. найденный повтор)
1) Последний элемент - ничего не менять (в нумерации)
2) Если значение элемента равно значению предыдущего ИЛИ последующего элемента - ничего не менять (в нумерации)
3) Первый элемент и НЕ равен 2-му - уменьшить на 1 все оставшиеся после него значения элементов массива

Добавлено через 6 минут
4) В остальных случаях - уменьшить на 1 все оставшиеся после него значения элементов массива

Т.е. объединив по результирующему действию - это 2 условия

Добавлено через 26 минут
Нашли какой элемент в М2 удалить (перебирая по порядку)
Получим такое условие для М3:
Удаляемый элемент последний ИЛИ (его значение равно предыдущему ИЛИ следующему значению)
То
Уменьшить значение всех элементов на 1 после удаляемого
В остальных случаях ничего с нумерацией не менять
0
1 / 1 / 0
Регистрация: 10.02.2014
Сообщений: 98
29.05.2018, 11:20  [ТС]
Вот представил поэтапность обработки Вашей логикой и второй столбец как я это представил
Миниатюры
Удаление дублей в массиве  
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
29.05.2018, 11:57
Цитата Сообщение от ALARMus75 Посмотреть сообщение
строка 59: ERROR TypeError: M1.indexOf is not a function на символе 1.
JavaScript
1
2
3
4
5
6
7
8
9
        Array.prototype.indexOf = function (item)
        {
            for (var i = 0; i < this.length; i++)
            {
                if (this[i] == item)
                    return i;
            }
            return -1;
        }
Цитата Сообщение от ALARMus75 Посмотреть сообщение
Верно, т.е. те кто был вместе в очереди (с одним номером) так и должны остаться вместе и конечная нумерация должна идти по возрастанию от 2. (осталось после удаления - 2446 - надо сделать 2334)
У меня в последнем варианте это условие соблюдается, но немного отличается от того, что ты описал ниже. Например в первой паре удалятся двойка, то есть остается 34, но относительная очередность сохраняется. Может такой вариант сойдет или непременно надо как ты описал? В принципе тот алгоритм не очень хорош, но его можно малость оптимизировать. Например добавить массиву функцию оптимизации (хотя можно и отдельно ее описать) следующего плана
JavaScript
1
2
3
4
5
6
7
8
9
10
11
        Array.prototype.optimizeQueue = function ()
        {
            var result = [], delta = 0;
            for (var i = 0; i < this.length; i++)
            {
                var d = this[i] - this[i - 1] - 1;
                delta += d > 0 ? d : 0;
                result.push(this[i] - delta);
            }
            return result;
        }
И тогда это будет выглядеть так
JavaScript
1
2
3
4
5
6
7
8
9
        var M23 = M2.zip(M3).map(function (v)
        {
            var v23 = v[0].zip(v[1]).filter(function (vv, i, a)
            {
                return M1.indexOf(vv[0]) < 0 && a.findIndex(function (x) { return x[0] == vv[0] }) == i;
            }).unzip();
            return [v23[0], v23[1].optimizeQueue()];
        }).filter(function (v) { return v[0].length > 0; }).unzip();
        console.log(M23);
Вот смотри что она делает
JavaScript
1
2
console.log([1, 2, 3, 3, 3, 5, 6, 6, 6, 7, 9, 11, 11, 11, 12, 15].optimizeQueue());
//[1,  2,  3,  3,  3,  4,  5,  5,  5,  6,  7,  8,  8,  8,  9,  10]
Или все-таки абсолютная нумерация тоже имеет значение?

Добавлено через 13 минут
Кстати говоря, если все элементы такой последовательности сдвинуть к перовому номеру исходной, то, насколько я понимаю получится именно то, о чем ты говоришь.
Короче вот так вот, наверное должно быть
PHP/HTML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
<!DOCTYPE html>
 
<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <script>
        Array.prototype.map = function (fn)
        {
            var result = [];
            for (var i = 0; i < this.length; i++)
            {
                result.push(fn(this[i], i, this));
            }
            return result;
        }
 
        Array.prototype.filter = function (fn)
        {
            var result = [];
            for (var i = 0; i < this.length; i++)
            {
                if (fn(this[i], i, this))
                    result.push(this[i]);
            }
            return result;
        }
 
        Array.prototype.find = function (fn)
        {
            for (var i = 0; i < this.length; i++)
            {
                if (fn(this[i], i, this))
                    return this[i];
            }
            return null;
        }
        Array.prototype.findIndex = function (fn)
        {
            for (var i = 0; i < this.length; i++)
            {
                if (fn(this[i], i, this))
                    return i;
            }
            return -1;
        }
 
        Array.prototype.indexOf = function (item)
        {
            for (var i = 0; i < this.length; i++)
            {
                if (this[i] == item)
                    return i;
            }
            return -1;
        }
 
        Array.prototype.zip = function (scnd)
        {
            return this.map(function (v, i) { return [v, scnd[i]]; });
        }
 
        Array.prototype.unzip = function ()
        {
            return [this.map(function (v) { return v[0]; }), this.map(function (v) { return v[1]; })];
        }
 
        Array.prototype.optimizeQueue = function ()
        {
            var result = [], delta = 0;
            for (var i = 0; i < this.length; i++)
            {
                var d = this[i] - this[i - 1] - 1;
                delta += d > 0 ? d : 0;
                result.push(this[i] - delta);
            }
            delta = result[0] - this[0];
            return result;
        }
 
 
        var M1 = ["A"];
        var M2 = [["A", "B", "C"], ["A", "B", "C"], ["B", "A", "C"], ["B", "A", "C"], ["B", "A", "C"], ["B", "C", "A"], ["B", "C", "A"], ["B", "C", "D"], ["B", "B", "C"], ["B", "A", "B", "C"]];
        var M3 = [[2, 3, 4], [2, 2, 3], [2, 3, 4], [2, 2, 3], [2, 3, 3], [2, 3, 3], [2, 3, 4], [2, 3, 4], [2, 3, 4], [2, 3, 4, 4]];
 
        var M23 = M2.zip(M3).map(function (v)
        {
            var v23 = v[0].zip(v[1]).filter(function (vv, i, a)
            {
                return M1.indexOf(vv[0]) < 0 && a.findIndex(function (x) { return x[0] == vv[0] }) == i;
            }).unzip();
            return [v23[0], v23[1].optimizeQueue().map(function (vv,ii,aa) { return vv - (aa[0] - v[1][0]); })];
        }).filter(function (v) { return v[0].length > 0; }).unzip();
        console.log(M23);
 
        console.log([1, 2, 3, 3, 3, 5, 6, 6, 6, 7, 9, 11, 11, 11, 12, 15].optimizeQueue());
 
    </script>
</body>
</html>
1
1 / 1 / 0
Регистрация: 10.02.2014
Сообщений: 98
30.05.2018, 12:38  [ТС]
Забыл указать что я имел ввиду на картинке (пост №29)

Строки из цифр это варианты очередей, которые, мне кажется, учитывают все варианты комбинаций.
==============
Ремарочка в рассматриваемом массиве М3 не может быть первого номера очереди - это номер очереди будущих согласующих.
Номер один (при первичном создании, когда и надо устранить дубликаты) всегда в таблице М1 - одна или более фамилий с номером один очереди.
==============

Заменил 2 последние строки (console.log - не знает такого) на:
JavaScript
1
2
print("M23 = "+M23);
print("Оптимизация массива, результат = "+[1, 2, 3, 3, 3, 5, 6, 6, 6, 7, 9, 11, 11, 11, 12, 15].optimizeQueue());
Результат такой:
Оптимизация массива, результат = 1,2,3,3,3,4,5,5,5,6,7,8,8,8,9,10
M23 = B,C,B,C,B,C,B,C,B,C,B,C,B,C,B,C,D,B,C,B, C,2,3,2,3,2,3,2,3,2,3,2,3,2,3,2,3,4,2,3, 2,3

Добавлено через 9 минут
*************

Из описания языка к приложению нашел наличие только этой функции:
Since indexOf is not available on Arrays, the array has to be converted to a string before using this function to find if a single element is part of the array.

Добавлено через 22 часа 39 минут
А как получить исходные массивы М2 и М3 только уже с новыми данными (скорректированными) ?
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
30.05.2018, 14:04
Цитата Сообщение от ALARMus75 Посмотреть сообщение
А как получить исходные массивы М2 и М3 только уже с новыми данными (скорректированными) ?
Дык они в выходном массиве под индексами 0 и 1.
JavaScript
1
2
M2 = M23[0];
M3 = M23[1];
1
1 / 1 / 0
Регистрация: 10.02.2014
Сообщений: 98
30.05.2018, 17:15  [ТС]
Еще бы теперь понять для себя как все работает в этом скрипте.

Добавлено через 1 час 28 минут
Попробовал использовать в своей системе но возникли проблемы.

Кликните здесь для просмотра всего текста
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Array.prototype.map = function (fn)
        {
            var result = [];
            for (var i = 0; i < this.length; i++)
            {
                result.push(fn(this[i], i, this));
            }
            return result;
        }
 
        Array.prototype.filter = function (fn)
        {
            var result = [];
            for (var i = 0; i < this.length; i++)
            {
                if (fn(this[i], i, this))
                    result.push(this[i]);
            }
            return result;
        }
 
        Array.prototype.find = function (fn)
        {
            for (var i = 0; i < this.length; i++)
            {
                if (fn(this[i], i, this))
                    return this[i];
            }
            return null;
        }
        Array.prototype.findIndex = function (fn)
        {
            for (var i = 0; i < this.length; i++)
            {
                if (fn(this[i], i, this))
                    return i;
            }
            return -1;
        }
 
        Array.prototype.indexOf = function (item)
        {
            for (var i = 0; i < this.length; i++)
            {
                if (this[i] == item)
                    return i;
            }
            return -1;
        }
 
        Array.prototype.zip = function (scnd)
        {
            return this.map(function (v, i) { return [v, scnd[i]]; });
        }
 
        Array.prototype.unzip = function ()
        {
            return [this.map(function (v) { return v[0]; }), this.map(function (v) { return v[1]; })];
        }
 
        Array.prototype.optimizeQueue = function ()
        {
            var result = [], delta = 0;
            for (var i = 0; i < this.length; i++)
            {
                var d = this[i] - this[i - 1] - 1;
                delta += d > 0 ? d : 0;
                result.push(this[i] - delta);
            }
            delta = result[0] - this[0];
            return result;
        }
 
function RemoveAppDuplicate(M1, M2, M3)
{
    var M23 = M2.zip(M3).map(function (v)
        {
            var v23 = v[0].zip(v[1]).filter(function (vv, i, a)
            {
                return M1.indexOf(vv[0]) < 0 && a.findIndex(function (x) { return x[0] == vv[0] }) == i;
            }).unzip();
            return [v23[0], v23[1].optimizeQueue().map(function (vv,ii,aa) { return vv - (aa[0] - v[1][0]); })];
        }).filter(function (v) { return v[0].length > 0; }).unzip();
return M23;
}

Произвожу вызов функции из библиотеки, в которой она создана.
JavaScript
1
2
3
4
var New_App_list = new Array
New_App_list.push(lib.MOS_Test_quick3.RemoveAppDuplicate(["A"],[["B","A", "C"]], [[2,3,4]]));
print("1: "+New_App_list[0]);
print("2: "+New_App_list[1]);
Результат:
2: undefined
1: B,C,2,3


Добавлено через 6 минут
М1 и М2 как и М3 одинаковые массивы (не по значению).
т.е. М2 это - ["B","A", "C"] - один из вариантов
а остальное это возможные его варианты относительно М1 и М3
Так и М3 это [2,3,4]
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
30.05.2018, 17:17
Цитата Сообщение от ALARMus75 Посмотреть сообщение
Результат:
2: undefined
1: B,C,NaN,NaN
Мой код рассчитан на входные данные определенного формата. если ты меняешь формат, то естественно результат будет другим. Почему у тебя M2 задан так [["B","A", "C"]], а M3 так [2,3, 4], а не так [[2,3, 4]]? Я остального не проверял, но, думаю, этого достаточно, чтобы получить ошибку.
0
1 / 1 / 0
Регистрация: 10.02.2014
Сообщений: 98
30.05.2018, 17:20  [ТС]
да это исправил (вызов под написанный код и для [[2,3,4]])

Но результат получаю одним массивом из вызываемой функции (подправил предыдущий пост)
Можно наверно добавить еще один аргумент вызова функции, а в самой функции указать условие по которому возвращаем либо [0] либо [1] элемент массива
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
30.05.2018, 17:50
ALARMus75, по какой-то неведомой причине, все упаковывается в еще один массив. Может потом посмотрю в чем дело. А пока можно вывести так
JavaScript
1
2
print("1: "+New_App_list[0][0]);
print("2: "+New_App_list[0][1]);
либо в 84-ой строке сделай так
JavaScript
1
return M23[0];
и выводи как выводил. Вроде было нормально все.

Добавлено через 10 минут
ALARMus75, ёпрст, ты ж сам упаковал все в еще один массив. Вот это вот нахрена нужно?
JavaScript
1
2
var New_App_list = new Array
New_App_list.push
Ты ж результат упаковал в лишний массив, а потом удивляешься, что результат не то.
JavaScript
1
2
3
var result = lib.MOS_Test_quick3.RemoveAppDuplicate(["A"],[["B","A", "C"]], [[2,3,4]])
print("1: "+result[0]);
print("2: "+result[1]);
0
1 / 1 / 0
Регистрация: 10.02.2014
Сообщений: 98
30.05.2018, 21:13  [ТС]
Цитата Сообщение от diadiavova Посмотреть сообщение
ёпрст, ты ж сам упаковал все в еще один массив. Вот это вот нахрена нужно?
Считал, что этим я объявил массив и пушем занес в него данные.

А почему первый массив пишем в 1-й паре скобок - ["A"]
А остальные в 2-х парах - [["B","A","C"]] и [[1,1,1]] ?
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
30.05.2018, 21:14
ALARMus75, А почему ты меня об этом спрашиваешь? Как ты условие поставил, так я и сделал.
0
1 / 1 / 0
Регистрация: 10.02.2014
Сообщений: 98
30.05.2018, 22:37  [ТС]
Это потому, что объясняя и имел ввиду не то как Вы меня поняли
Все три массива одномерные.
Объясняя я показал пример того какие взаимные значения они могут принимать (М2 и М3)
0
 Аватар для diadiavova
7261 / 2608 / 745
Регистрация: 11.04.2015
Сообщений: 4,155
Записей в блоге: 43
30.05.2018, 23:09
ALARMus75, а я понял, что в массивах 2 и 3 содержится по нескольку блоков. Если они одномерные и то, что я принял за блоки было просто отдельными вариантами, то задача существенно упростилась бы.
JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        function RemoveAppDuplicate(M1, M2, M3)
        {
            var v23 = M2.zip(M3).filter(function (vv, i, a)
            {
                return M1.indexOf(vv[0]) < 0 && a.findIndex(function (x) { return x[0] == vv[0] }) == i;
            }).unzip();
            var d = v23[1][0] - M3[0];
            return [v23[0], v23[1].optimizeQueue().map(function (v) { return v - d; })];
        }
 
 
        var result = RemoveAppDuplicate(["A"], ["B", "A", "C"], [2, 3, 4]);
        console.log("1: ", result[0]);
        console.log("2: ", result[1]);
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.05.2018, 23:09

Удаление дублей php
Добрый вечер. У меня в базу записывается некая статистика, и так как запрос &quot;INSERT INTO&quot; нельзя ограничить в одно добавление, изредко...

Удаление дублей в файле
но нчее не получлось как всегда, решил вспомнить программирование называется. вот код, какую-то фигню выводит... Может уже есть пример...

Excel - Удаление дублей.
Гуру Экселя, помогите решить непосильную задачу. Дано: Документ на ~20 тыс. строк содержащий некоторое кол-во дублей. Задача: ...

Удаление дублей из textBox
Нужно сделать чтобы по нажатию на button удалялись дубли строк из textBox

Удаление дублей по условию
Привет всем. Один вопрос. База в 2 млн. организаций. Есть дубли следующего рода: Ячейка А1 Ячейка В1 Ячейка С1 Компания (А) адрес...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru