Найдите недостающий элемент, сравнив 2 2D-массива в Javascript - PullRequest
0 голосов
/ 22 марта 2012

Несколько дней назад я опубликовал ветку с вопросом, как найти отсутствующий элемент при передаче JS-массивов метода 2. Как вы видите здесь . Я пытался выяснить, как изменить метод так, чтобы вместо его передачи 2 массивов вы передавали 2 2D-массива ... Однако возникли некоторые проблемы:

/*var sml = new Array();
sml[0] = new Array("dean","22");
sml[1] = new Array("james","31");
sml[2] = new Array("ludwig","35");

var lrg = new Array();
lrg[0] = new Array("dean","22");
lrg[1] = new Array("james","31");
lrg[2] = new Array("ludwig","35");
lrg[3] = new Array("kevin","23");
lrg[4] = new Array("elton","40");*/

var sml = new Array();
sml[0] = "dean";
sml[1] = "james";
sml[2] = "ludwig";

var lrg = new Array();
lrg[0] = "dean";
lrg[1] = "james";
lrg[2] = "ludwig";
lrg[3] = "kevin";
lrg[4] = "elton";


var deselected = findDeselectedItem(sml, lrg);

alert("Deselected Items: " + deselected[0]+", "+ deselected[1]);

// -------------------------------------------------------------- //

function findDeselectedItem(CurrentArray, PreviousArray) {


var CurrentArrSize = CurrentArray.length;
var PreviousArrSize = PreviousArray.length;
var deselectedItems = new Array();

// loop through previous array
for (var j = 0; j < PreviousArrSize; j++) {

    // look for same thing in new array
    if (CurrentArray.indexOf(PreviousArray[j]) == -1)

    deselectedItems.push(PreviousArray[j]);

}

if (deselectedItems.length != 0) {
    return deselectedItems;
} else {
    return null;
}

}​

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

var sml = new Array();
sml[0] = new Array("dean","22");
sml[1] = new Array("james","31");
sml[2] = new Array("ludwig","35");

var lrg = new Array();
lrg[0] = new Array("dean","22");
lrg[1] = new Array("james","31");
lrg[2] = new Array("ludwig","35");
lrg[3] = new Array("kevin","23");
lrg[4] = new Array("elton","40");

/*var sml = new Array();
sml[0] = "dean";
sml[1] = "james";
sml[2] = "ludwig";

var lrg = new Array();
lrg[0] = "dean";
lrg[1] = "james";
lrg[2] = "ludwig";
lrg[3] = "kevin";
lrg[4] = "elton";*/


var deselected = findDeselectedItem(sml, lrg);

alert("Deselected Items: " + deselected[0]+", "+ deselected[1]);

// -------------------------------------------------------------- //

function findDeselectedItem(CurrentArray, PreviousArray) {


var CurrentArrSize = CurrentArray.length;
var PreviousArrSize = PreviousArray.length;
var deselectedItems = new Array();

// loop through previous array
for (var j = 0; j < PreviousArrSize; j++) {

    // look for same thing in new array
    if (CurrentArray.indexOf(PreviousArray[j][0]) == -1)

    deselectedItems.push(PreviousArray[j][0]);

}

if (deselectedItems.length != 0) {
    return deselectedItems;
} else {
    return null;
}

}​

Метод возвращает 2 совершенно неправильных значения. PS - меня пока не интересуют «цифры», только «имена» ...

Ответы [ 3 ]

2 голосов
/ 22 марта 2012

Ваш CurrentArray является двумерным и indexOf сравнивает массивы, но не первые элементы этих массивов.Поэтому вам нужно использовать:

for ( var i = 0; i < CurrentArray.length; ++i){
    if (CurrentArray[i][0] == PreviousArray[j][0]){
        deselectedItems.push(PreviousArray[j][0]);
        break;
    }
}

Вместо

if (CurrentArray.indexOf(PreviousArray[j][0]) == -1)
    deselectedItems.push(PreviousArray[j][0]);
1 голос
/ 22 марта 2012

Вы также можете переставить массив следующим образом:

var sml = {};
sml["dean"] = 22;
sml["james"] = 31;
sml["ludwig"] = 35;

var lrg = {};
lrg["dean"] = 22;
lrg["james"] = 31;
lrg["ludwig"] = 35;
lrg["kevin"] = 23;
lrg["elton"] = 40;

и использование:

function findDeselectedItem(c,p){
    ret=[];
    for (var i in p){
        if (p.hasOwnProperty(i)){
            if ('undefined'===typeof c[i]) {
                ret.push(i);
            }
        }
    }
    return ret;
}


alert(findDeselectedItem(sml, lrg));

Демо: http://jsfiddle.net/LsrCj/

1 голос
/ 22 марта 2012

indexOf функция проверит равенство объектов в этом случае;чтобы заставить его возвращать что-то, отличное от -1, вы должны передать одинаковые экземпляры 2D-массива в sml и lrg.

new Array("dean","22") === new Array("dean","22") //false

Сохраните одинаковые экземпляры (например, http://jsfiddle.net/3TQYz/) в обоих массивах или используйтесобственный indexOf тест, который будет рекурсивно проверять значения массива, чтобы ваш случай работал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...