1

我需要在“数组数组”中找到一个丢失的数组。我首先在下面找到这个函数(在 StackOverflow 上):

function findDeselectedItem(CurrentArray, PreviousArray) {

   var CurrentArrSize = CurrentArray.length;
   var PreviousArrSize = PreviousArray.length;
   var deselectedItem = [];

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

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

   }

   return deselectedItem;
}

如果你做了这样的事情,这工作得很好:

oldarray = ["hi", "ho", "hey"];
newarray = ["hi", "hey"];

使用findDeselectedItem(newarray, oldarray)将返回 ["ho"]。

但是,我的内容如下所示:

oldarray = [["James", 17, 1], ["Olivia", 16, 0], ["Liam", 18, 1]];
newarray = [["Olivia", 16, 0], ["James", 17, 1]];

如何调整上面的函数,使其返回包含“Liam”的缺失数组。

谢谢

4

6 回答 6

2

我会用名字作为键来做一个哈希。这将使查找丢失的内容变得微不足道且非常快速。然后,您可以通过不每次都重新构建哈希来优化该方法,但仅在确实需要时。

var oldArray = [["James", 17, 1], ["Olivia", 16, 0], ["Liam", 18, 1]];
var newArray = [["Olivia", 16, 0], ["James", 17, 1]];

function findDeselectedItems(oldArray, newArray)
{
   var results = [];

   var hash = {};
   for (var i=0; i<newArray.length; i++) {          
      hash[newArray[i].join(',')] = true;
   }

   for (var i=0; i<oldArray.length; i++) {
      if (!hash[oldArray[i].join(',')]) {
        results.push(oldArray[i]);
      }   
   }

   return results;
}   
于 2013-07-27T12:06:05.397 回答
1

问题可能是indexOf使用严格相等。即,如果'previous'数组中的一个项目实际上不在'current'数组中,它会报告它不在那里。

您将不得不自己迭代这些值(而不是使用indexOf)并检查数组是否包含与数组“相同”(但字面上不一样)的东西。

即,如果我对自己的解释不够好,请看一下;

['bob'] == ['bob']; //false
//therefore
[['bob']].indexOf(['bob']); //-1
于 2013-07-27T12:09:38.340 回答
0

我希望这对你有帮助

function findDeselectedItem(CurrentArray, PreviousArray) {

    var CurrentArrSize = CurrentArray.length;
    var PreviousArrSize = PreviousArray.length;
    var deselectedItem = [];

    // loop through previous array
    for(var j = 0; j < PreviousArrSize; j++) {
        var checkArray = PreviousArrSize[j];
        // loop through 2nd array to match both array

        for(var i = 0; i < CurrentArrSize; i++) {
            // look for same thing in new array
            if (CurrentArray[i].indexOf(checkArray) == -1)
                deselectedItem.push(CurrentArray[i]);

        }
    }
    return deselectedItem;
}
于 2013-07-27T11:55:31.940 回答
0

@KarelG:不错且快速的解决方案,但不应该var checkArray = PreviousArr[j];代替var checkArray = PreviousArrSize[j];吗?

于 2013-07-27T12:03:02.367 回答
0
function findDeselectedItem(CurrentArray, PreviousArray) {

    var CurrentArrSize = CurrentArray.length;
    var PreviousArrSize = PreviousArray.length;
    var deselectedItem = [];
    var selectedIndices = [];

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

   for(k=0; k < CurrentArrSize ; k++){
      if (CurrentArray[k].toString() === PreviousArray[j].toString()){
          selectedIndices.push(j);
          break;
      }

   }

 }

    for(var l = 0; l < PreviousArrSize; l++){
      if(selectedIndices.indexOf(l) === -1){
         deselectedItem.push(PreviousArray[l]);
      }
    }

      return deselectedItem;
}
于 2013-07-27T12:19:18.257 回答
0

我认为您不能使用 indexOf 来比较两个数组。您需要进行更深入的比较。尽管此代码可以用另一种方式编写,但您可以使用数组比较函数并使用 Array.some() 过滤元素。这是一个例子和一个小提琴

// Credit http://stackoverflow.com/questions/7837456/comparing-two-arrays-in-javascript
// attach the .compare method to Array's prototype to call it on any array
Array.prototype.compare = function (array) {
    // if the other array is a falsy value, return
    if (!array)
        return false;

    // compare lengths - can save a lot of time
    if (this.length != array.length)
        return false;

    for (var i = 0; i < this.length; i++) {
        // Check if we have nested arrays
        if (this[i] instanceof Array && array[i] instanceof Array) {
            // recurse into the nested arrays
            if (!this[i].compare(array[i]))
                return false;
        }
        else if (this[i] != array[i]) {
            // Warning - two different object instances will never be equal: {x:20} != {x:20}
            return false;
        }
    }
    return true;
}

function findDeselectedItem(CurrentArray, PreviousArray) {

    var CurrentArrSize = CurrentArray.length;
    var PreviousArrSize = PreviousArray.length;
    var deselectedItem = [];

    // loop through previous array
    for (var j = 0; j < PreviousArrSize; j++) {
        // look for same thing in new array
        CurrentArray.some(function (a, idx) {
            if(PreviousArray[j].compare(a) == false) {
                deselectedItem.push(PreviousArray[j]);
                return true;
            }
        });
    }

    return deselectedItem;
    }

var oldarray =[["James", 17, 1], ["Olivia", 16, 0], ["Liam", 18, 1]];
var newarray =[["Olivia", 16, 0], ["James", 17, 1]];

console.log(findDeselectedItem(newarray, oldarray));
于 2013-07-27T12:23:20.523 回答