我试图通过找出移动了哪个元素来找到两个数组之间的区别。我知道确切地移动了一个元素,并且将为列表的其余部分维护订单,但我无法弄清楚如何找到它。
示例:
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
答案 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] */