【问题标题】:Get the difference (additions and deletions) between two arrays / strings获取两个数组/字符串之间的差异(添加和删除)
【发布时间】:2014-10-06 00:17:09
【问题描述】:

我有一个array,它会通过用户输入(键盘)进行更新。我想跟踪哪些条目发生变化以获得更好的现场表演。

这里是一个例子:

// ascii values for 'Stuckoverflow'
var previousBlocks = [
     83, 116, 117, 99, 107, 111, 118,
     101, 114, 102, 108, 111, 119
];

// ascii values for 'Stackedoverflow2014'
var blocks = [
     83, 116, 97, 99, 107, 101, 100, 111, 118,
     101, 114, 102, 108, 111, 119,
     50, 48, 49, 52
];

我想获取从previousBlocksblocks 中添加或删除的条目的位置。较大的未更改部分应保持不变。 (在这种情况下'溢出')

var result = {
    deletions: [2],
    additions: [2, 5, 6, 13, 14, 15, 16]
};

人类可读,区别可以这样表达:

St[-u][+a]ck[+e][+d]overflow[+2][+0][+1][+4]

【问题讨论】:

标签: javascript arrays algorithm comparison difference


【解决方案1】:

因为array 被用户操纵(通过键入),所以更改是聚集在一起的。该解决方案计算一个变化范围并确定替换块。这是一个非常简单的解决方案,但它确实发挥了作用。

var start = 0;
var end = 0;
var length = Math.min(previousBlocks.length, length);

// compare from left to right
while (
    start < length
    && previousBlocks[start]
        == blocks[start]
) {
    start ++;
}

// compare from right to left
while (
    end < length - start
    && previousBlocks[previousBlocks.length - end - 1]
        === blocks[blocks.length - end - 1]
) {
    end ++;
}

// collect the blocks that have been added
var rangeBlocks = [];
for (var i = start; i < blocks.length - end; i ++)
{
    rangeBlocks.push(blocks[i]);
}

return {
    // unchanged amount of blocks on the left
    startOffset: start,

    // unchanged amount of blocks on the right
    endOffset: end,

    // exchange / replace the changed part by these blocks
    blocks: rangeBlocks
};

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多