如何确定在数组中移动了哪个元素?

时间:2014-03-30 06:02:56

标签: javascript jquery arrays

我试图通过找出移动了​​哪个元素来找到两个数组之间的区别。我知道确切地移动了一个元素,并且将为列表的其余部分维护订单,但我无法弄清楚如何找到它。

示例:

  

A:1 2 3 4 5 6

     

B:2 3 4 5 1 6

两个列表中都存在所有元素,但是如何找出元素1从索引0移动到索引4?

我采取的基本方法是:

//Original array
var a = [1, 2, 3, 4, 5, 6];

//New array
var b = [2, 3, 4, 5, 1, 6];

for(var i=0; i < a.length; i++) {
    if(a[i] != b[i] && a[i+1] != b[i]) {
        console.log(b[i] + " moved");
    }
}

我已经修改了代码来打印b [i]而不是[i],但它并不适用于所有情况,例如:

  

A:1,2,3,4

     

B:1,4,2,3

4 个答案:

答案 0 :(得分:5)

问题在于if语句中的第二个条件。在您的示例中,当元素a[0]移动时a[0+1] === b[0],因此if子句的计算结果为false。

尝试改为,

var idx = 0;
var len = a.length;
while ((a[idx] === b[idx] || a[idx] === b[idx+1]) && idx < len) {
    idx++;
}
console.log('Element a[' + idx + ']=' + a[idx] + ' moved.');

答案 1 :(得分:4)

基本上,如果我理解正确,元素移动意味着它被删除并插入 别的地方。 所以你首先找到删除/插入的第一个点:

function whichMoved(a, b) {
      for(var i=0; i < a.length; i++) {
        if (a[i] != b[i]) {

现在,如果它是删除,那么元素已经向前移动,意味着,插入b中的更大索引,并且索引之间的所有元素都向左移动, 意味着下一个元素已将一个地方向后移动:

if(a[i+1] == b[i]) {
    console.log(a[i] + " moved forward");
    break;
}

否则,元素向后移动:

else {
    console.log(b[i] + " moved backward")
    break;
}

整个事情:

//Original array
var a = [1, 2, 3, 4, 5, 6];

//testing
whichMoved(a, [2,3,4,5,1,6]); //prints 1 moved forward
whichMoved(a, [5,1,2,3,4,6]); //prints 5 moved backward
function whichMoved(a, b) {
  for(var i=0; i < a.length; i++) {
    if (a[i] != b[i]) {
      if(a[i+1] == b[i]) {
        console.log(a[i] + " moved forward");
        break;
      } else {
        console.log(b[i] + " moved backward")
        break;
      }
    }
  }
}

答案 2 :(得分:1)

你可以使用jQuery .inArray()它将返回索引,从0开始,如果找不到则返回-1:

var a = [1, 2, 3, 4, 5, 6];

//New array
var b = [2, 3, 4, 5, 1, 6];

for(i=0; i < a.length; i++) {
    var j = $.inArray(a[i], b);

    if(i != j){
        console.log(a[i], "moved to index "+j);
    }else{
        console.log(a[i], "not moved");
    } 
}

请参阅此jsfiddle:http://jsfiddle.net/Rdzj4/

答案 3 :(得分:1)

编辑 - 可能不需要,但我不想留下错误的答案。

在这里,我看一下每个项目与原始索引的距离

并认为最不合规的是动力 -

这假设在[2,1,3,4,5,6]中是移动的两个,而不是1,

并且在[1,2,3,4,6,5]中它是6,而不是5。

function whoMoved(a, b){
    var max= 0, min= a.length, dist, 
    order= b.map(function(itm, i){
        dist= i-a.indexOf(itm);
        if(dist<min) min= dist;
        if(dist>max) max= dist;
        return dist;
    });
    if(Math.abs(min)>= max) max= min;
    return b[order.indexOf(max)];
}

//测试

var a= [1, 2, 3, 4, 5, 6];

var b= [1, 6, 2, 3, 4, 5];//6 to left
var c= [1, 3, 4, 2, 5, 6];//2 to to right
var d= [3, 1, 2, 4, 5, 6];//3 to left
var e= [2, 3, 4, 5, 1, 6];//1 to right

[whoMoved(a, b), whoMoved(a, c), whoMoved(a, d),whoMoved(a, e)];

/*  returned value: (Array) [6,2,3,1] */