繁体   English   中英

通过比较JavaScript中的2个2D数组来查找丢失的元素

[英]Find missing element by comparing 2 2D-Arrays in Javascript

几天前,我发布了一个线程,询问在传递方法2 JS数组时如何查找缺少的元素。 正如你可以看到在这里 我一直在尝试找出如何修改该方法的方法,这样您无需传递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-我现在对“数字”不感兴趣,现在对“名称”不感兴趣...

您的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]);

在这种情况下, indexOf函数将检查对象是否相等。 为了使其返回-1以外的值,您必须将相同的2D数组实例传递给sml和lrg。

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

在两个数组中都保留相同的实例(例如, http : //jsfiddle.net/3TQYz/ ),或者使用您自己的indexOf测试,该测试将递归检查数组的值以使案例工作。

您还可以像这样重新排列数组:

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/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM