PDA

Просмотр полной версии : as1, сравнить массивы


Mnilionic
15.10.2005, 02:56
old_data = ["a", "b", "g"];
new_data=["b", "c", "f", "k"];
помогите, пожалуйста, получить массивы:
get_element = ["c", "f", "k"];
lost_element = ["b", "g"];

iNils
15.10.2005, 11:47
А логика какая?

Mnilionic
15.10.2005, 19:54
сравнив старый и новый массив нужно получить элементы которых нет в old_data и соответственно, которых нет в new_data

KidsKilla
15.10.2005, 20:11
видимо
old_data = ["a", "b", "g"];
new_data=["b", "c", "f", "k"];
и
get_element = ["c", "f", "k"];
lost_element = ["a", "g"];
...

Mnilionic
15.10.2005, 20:23
это дано:
old_data = ["a", "b", "g"];
new_data=["b", "c", "f", "k"];

а это ответ:
get_element = ["c", "f", "k"];
lost_element = ["a", "g"];

и нужно решение. понятно?

Mnilionic
16.10.2005, 02:26
в общем уже сам смастерил...

old_data = ["g", "a", "e", "d"];
new_data = ["e", "v", "a", "b", "c", "g"];
lost_data = old_data;
get_data = new_data ;
for (i1=0; i1<old_data.length; i1++) {
for (i2=0; i2<new_data.length; i2++) {
if (old_data[i1] == new_data[i2]) {
lost_data.splice(i1, 1);
get_data.splice(i2, 1);
i1--;
break;
}
}
}
trace(lost_data);
trace(get_data);

iNils
16.10.2005, 02:42
только не понятен смысл:
lost_data = old_data;
get_data = new_data;

в данном случаи ты создаешь не новые массивы, а указатели на массивы. и производя действия с lost_data, ты делаешь то же самое и в old_data

KidsKilla
16.10.2005, 03:03
lost_data = old_data.concat();
get_data = new_data.concat();

iNils
16.10.2005, 03:23
Да нет, ты не прав. Ты создаешь массив с одним элементом который есть String. Вариант KidsKilla то что нужно.

Mnilionic
16.10.2005, 03:24
iNils, вариант KidsKilla тоже вызывает аборт скриптов :(

KidsKilla
16.10.2005, 03:36
var a = [1,2,3,4];
var b = [1,2,3,5,6]
var lost_data = a.concat();
var get_data = b.concat();
for(var i=a.length; --i>=0;){
for(var j=b.length; --j>=0;){
if (a[i] == b[j]) {
lost_data.splice(i, 1);
get_data.splice(j, 1);
break;
}
}
}
trace(["lost[",lost_data,"] get[", get_data,"]"]);
trace([a," : ",b])

Mnilionic
16.10.2005, 03:42
KidsKilla, прекрасно! А почему в моей конструкции не работает?
было бы мило с вашей стороны растолковать мне.

KidsKilla
16.10.2005, 04:03
KidsKilla, прекрасно! А почему в моей конструкции не работает?
было бы мило с вашей стороны растолковать мне.
не знаю что там было не так, но совершенно точно i1-- было лишним.
по сути я скопировал твой же скрипт =)

KidsKilla
16.10.2005, 04:05
кстати, этот вариант будет работать с глюками. нужен другой...

iNils
16.10.2005, 04:08
old_data = ["a", "b", "c", "d"];
new_data = ["c", "d", "e"];
lost_data = String (old_data).split (",");
get_data = String (new_data).split (",");
for (i1 = 0; i1 < lost_data.length; i1++) {
for (i2 = 0; i2 < get_data.length; i2++) {
if (lost_data[i1] == get_data[i2]) {
lost_data.splice (i1, 1);
get_data.splice (i2, 1);
i1--;
break;
}
}
}
trace (old_data);
trace (new_data);
trace (lost_data);
trace (get_data);

KidsKilla
16.10.2005, 19:49
function compare(a,b){
function killDuplicates(arr) {
var uniqArr = [];
var i = arr.length;
var f = false;
function fnd(a, el) {
var i = a.length;
while (--i>=0) if (a[i] == el) return true;
return false;
}
while (--i>=0) {
for (var j = uniqArr.length; --j>=0; ) if (fnd(uniqArr, arr[i])) f = true;
if (f) {
f = false;
continue;
}
uniqArr[uniqArr.length] = arr[i];
f = false;
}
return uniqArr;
}
var lost_data = killDuplicates(a);
var get_data = killDuplicates(b);
for (var i=lost_data.length; --i;) {
for (var j=get_data.length; --j;) {
if (lost_data[i] == get_data[j]) {
lost_data.splice(i, 1);
get_data.splice(j, 1);
}
}
}
return {lost:lost_data, added:get_data};
}



var result = compare([1, 1, 1, 1, 2, 3, 4, 4, 4, 4], [1, 2, 3, 5, 6]);
trace("lost: "+result.lost);
trace("added: "+result.added);