在数组

时间:2015-10-23 17:08:40

标签: javascript arrays difference

假设有2个数组包含两个相同的值,并且已知只能同时交换2个值。

originalArray = [ "i0w66c25", "vnc1ar7f", "ajo3u8xl", "i13kn0bs" ]
sortedArray =   [ "vnc1ar7f", "i0w66c25", "ajo3u8xl", "i13kn0bs" ]

第一个数组是原始数组,后一个是排序版本。

如您所见,前两个值已在后一个版本中交换。

如何检测并返回已更改的值,例如:(或者,如果您有任何更好的想法,请继续!)

[
 {
   "changedWhat": "vnc1ar7f",
   "oldPosition": 1,
   "newPosition": 0
 }
 {
    "changedWhat": "i0w66c25",
    "oldPosition": 0,
    "newPosition": 1
 }
]

2 个答案:

答案 0 :(得分:2)

这假设两个数组的长度相同,不包含重复值,并且具有相同的项

var originalArray = ["i0w66c25", "vnc1ar7f", "ajo3u8xl", "i13kn0bs"];
var sortedArray = ["vnc1ar7f", "i0w66c25", "ajo3u8xl", "i13kn0bs"];

var changedItems =
  originalArray

    .filter(function(item, index) {
      return item != sortedArray[index]
    })

    .map(function(item) {
      return {
        "changedWhat": item,
        "oldPosition": originalArray.indexOf(item),
        "newPosition": sortedArray.indexOf(item)
      };
    });

console.log(changedItems);

首先,我们使用filter()来确定哪些项目确切不合适。

然后,我们map()将这些项目添加到自定义对象数组中。

答案 1 :(得分:1)

注意:这仅在数组

中没有重复值时才有效
originalArray = [ "i0w66c25", "vnc1ar7f", "ajo3u8xl", "i13kn0bs" ]
sortedArray =   [ "vnc1ar7f", "i0w66c25", "ajo3u8xl", "i13kn0bs" ]


var original = {}
var changes = []
originalArray.forEach(function(val,pos){original[val] = pos}) // we store original array indices of the values

sortedArray.forEach(function(val,pos){
    if(original[val] != pos){ // if position changed
        changes.push({changed:val, oldPos:original[val],newPos:pos})
    }
})

console.log(changes)