Jump to content
  • 0

Поиск и вывод только не совпавших элементов в массиве.


Dimaz
 Share

Question

Всем привет. Написал скрипт, ищущий в массиве только не совпавшие элементы и, выводящий их на экран.

var arr = [2,3,2,5,9,5,9];
var dim = [];
for(var i=0, a=0, b=0; i<arr.length; i++,b++){
dim[b] = arr[i];
a++;
for(var i2=0; i2<dim.length; i2++){
if (dim[i2] == arr[a]) {i++; a++;}
}
}
$('b').text(dim);?

Выводит 2,3,5,9.

Пришлось заводить аж 3 переменные в первом цикле. Может есть какой-нибудь более правильный способ. Ну и чтобы работал быстро.

Edited by Dimaz
Link to comment
Share on other sites

13 answers to this question

Recommended Posts

  • 0

<_< в Js разве нету знака неравенства ?

типа если неравно то вывести в противном случае ищем дальше О_О

:blink:

а тут как я понимаю если равно ищем дальше впротивном случае выводим?

разницы особой нет но если есть знак неравенства то в проверку его наверное логичнее впихнуть

Link to comment
Share on other sites

  • 0


var arr = [2, 3, 2, 5, 9, 5, 9];
arr = arr.sort(function(A, B) {return A - B;});

var newArr = [];

for (var i = 0; i < arr.length; i++) {
if (i > 0 && arr[i - 1] == arr[i]) continue;

newArr.push(arr[i]);
}

alert(newArr); // 2, 3, 5, 9

Правда без сортировки массива не обойтись.

Link to comment
Share on other sites

  • 0

Почему не работает? Вроде работает.

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

Link to comment
Share on other sites

  • 0

На моем компе массив из 100000 (ста тысяч) элементов сортируется за 21 миллисекунду. Тест нагуглил вот тут (абзац "Производительность"). Думаю это довольно шустро, проблем быть не должно.

Link to comment
Share on other sites

  • 0

Вот написал код. data это json-массив, принятый с сервера. В нем кроме id-ов пользователей, содержатся еще и другие данные. Поэтому прежде чем сортировать, я достал из json-массива только friend_id. А потом уже отсортировал полученный массив. Может как-то можно обойтись одним циклом в данном случае? Или я все сделал правильно?

function(data){
var dim = [];
var arr = [];
for(var i=0; i<data.length; i++){
dim[i] = data[i].friend_id;
}
dim = dim.sort(function(A, {return A - B;});
for (var i = 0; i < dim.length; i++) {
if (i > 0 && dim[i - 1] == dim[i]) continue;

arr.push(dim[i]);
}
console.log(arr);
...

Link to comment
Share on other sites

  • 0

Да, наверное лучше не сделать. По крайней мере я не могу сходу придумать как.

UPD: Хотя не, можно вот так делать:


?var data = {
'1': {
'id': 231745,
'name': 'xxx'
},
'2': {
'id': 1289735,
'name': 'yyy'
},
'3': {
'id': 3429876,
'name': 'aaa'
},
'4': {
'id': 1289735,
'name': 'yyy'
},
'5': {
'id': 231745,
'name': 'xxx'
},
'6': {
'id': 987,
'name': 'eee'
},
'7': {
'id': 456,
'name': 'vvv'
}
};???

function getUniqueData(data) {
var helper = {};

for (var i in data) {
if (!helper.hasOwnProperty(data[i].id)) {
helper[data[i].id] = data[i];
}
}

return helper;
}

var newData = getUniqueData(data);

console.log(newData);

Я конечно не знаю как выглядит ваш JSON поэтому попытался представить как он мог бы выгладеть. При таком методе мы обходимся одним циклом и на выходе получаем опять объект, где есть не только ID, но и дополнительная инфа, что удобней чем просто массив айдишников.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy