Javascript-форум (https://javascript.ru/forum/)
-   Javascript под браузер (https://javascript.ru/forum/css-html/)
-   -   Выбрать элементы с одного массива, которых нет в другом (https://javascript.ru/forum/css-html/53813-vybrat-ehlementy-s-odnogo-massiva-kotorykh-net-v-drugom.html)

desperado 19.02.2015 18:04

Выбрать элементы с одного массива, которых нет в другом
 
Всем привет. Есть 2 массива:

[1, 2, 3, 4, 5]
[0, 7, 1, 2, 3]

во второй массив добавляются новые элементы, (второй массив, это первый, но сколько добавилось, на столько он сдвинулся)

как найти новые добавленные элементы массива, в данном случае 0 и 7 (и из них сделать отдельный массив) ??

т.е. перебрать по сути надо каждый элемент первого

danik.js 19.02.2015 18:41

Правильно я понял, что первый элемент первого массива обязательно присутствует во втором массиве?

var array1 = [1, 2, 3, 4, 5];
var array2 = [0, 7, 1, 2, 3];

var diff = array2.slice(0, array2.indexOf(array1[0]));

alert(diff);

desperado 19.02.2015 19:36

Цитата:

Сообщение от danik.js (Сообщение 357343)
Правильно я понял, что первый элемент первого массива обязательно присутствует во втором массиве?


спасибо за ответ. Не факт, что он присутствует :)
если в первом массиве 10 элементов, и мне во второй пришло 10, то все 10 элементов второго массива сместились и совпадений не будет :)

danik.js 19.02.2015 19:50

Это все бесконтрольно что-ли происходит? Почему нельзя сразу, при изменении array2 учитывать все что нужно?

desperado 20.02.2015 10:50

Цитата:

Сообщение от danik.js (Сообщение 357357)
Это все бесконтрольно что-ли происходит? Почему нельзя сразу, при изменении array2 учитывать все что нужно?

делается запрос к серверу, в ответе массив, потом происходит какое то событие и опять запрос к серверу, в этом массиве вначале уже новые элементы. Вот по сути 2 массива и хотелось бы эти новые элементы отловить.:)

danik.js 20.02.2015 11:30

Значит сервер формирует массив. А попросить его сформировать третий массив нельзя? Или просто индекс последнего нового элемента.

desperado 20.02.2015 11:46

Цитата:

Сообщение от danik.js (Сообщение 357429)
Значит сервер формирует массив. А попросить его сформировать третий массив нельзя? Или просто индекс последнего нового элемента.

никого просить нельзя, надо отработать что дают.

danik.js 20.02.2015 12:04

Ну тогда indexOf. Если indexOf == -1, то значит весь массив состоит из новых элементов. Забираем его. Если нужна именно копия, то делаем через slice(0, array.length).

desperado 20.02.2015 12:26

Цитата:

Сообщение от danik.js (Сообщение 357450)
Ну тогда indexOf. Если indexOf == -1, то значит весь массив состоит из новых элементов. Забираем его. Если нужна именно копия, то делаем через slice(0, array.length).

не оч ясно. нужно каждый элемент нового массива сравнить с каждым второго....новый ли он.

рони 20.02.2015 12:31

desperado,
:write: вариант
var array1 = [1, 2, 3, 4, 5],
    array2 = [0, 7, 1, 2, 3];

function foo(arr1, arr2) {
    var diff = [];
    for (var i = 0; i < arr2.length; i++) {
        if (arr1[i] != arr2[i]) {
            diff.push(arr2.shift());
            i = 0
        }
    }
    return diff
}
alert(foo(array1, array2))

danik.js 20.02.2015 13:42

Цитата:

Сообщение от desperado
нужно каждый элемент нового массива сравнить с каждым второго....новый ли он

Зачем каждый? Как только нашли повторяющийся, за ним последуют остальные повторяющиеся, разве не так?
А indexOf как раз и находит первый повторяющийся, если он есть.

kotlov-net 21.02.2015 03:06

Вроде вот так можно, но не уверен:)
arr1=[1,2,30,4,5]
arr2=[9,80,1,2,30]

extract=function(oldArr, newArr){
 var i=0, ns="", oldArr=oldArr.join(), newArr=newArr.join()
 while(!new RegExp("^"+newArr.slice(i)).test(oldArr)) {ns+=newArr[i]; i++}

 return ns.split(",").filter(function(x){return x!==""})

}

alert(extract(arr1, arr2))



//>>>> [ '9', '80' ]

Вообще, по-моему, задача в общем случае, неразрешима. Неизвестно, какие данные придут в новый массив, они могут в любом подмножестве совпадать с исходными. Поэтому нет надежного шаблона для проверки.

Aetae 21.02.2015 03:20

kotlov-net прав.
array1 = [1, 2, 3, 4, 5]
array2 = [1, 2, 3, 1, 2]

array1 = [1, 2, 3, 4, 5]
array2 = [1, 2, 3, 4, 5] //полностью сменился
И что будете делать?

laimas 21.02.2015 13:35

>второй массив, это первый, но сколько добавилось, на столько он сдвинулся
......
>если в первом массиве 10 элементов, и мне во второй пришло 10, то все 10 элементов второго массива сместились и совпадений не будет


Уже не первый, и значит вполне возможно, что логика вложенная в решение задачи неудачна, так как эффективность этой проверки будет убывать по мере сдвига второго массива. А можно словами описать задачу, которую вы хотите решить, и для которой потребовался этот поиск? Может быть как раз сервер сразу бы возвращал ответ, как говорил danik.js?


Часовой пояс GMT +3, время: 20:07.