基于另一个数组排序数组(对象的更改顺序)

时间:2012-12-05 10:50:23

标签: javascript

我有两个Javascript数组对象,其中第一个按照我希望它排序的顺序排序,第二个数组按错误的顺序排序,例如:

1)SortedArray (0 - 10 items, 11 - 20 items, 21 - 30 items, 10000 - 20000 items)

2)按字母顺序排序的数组(0 - 10 items, 10000 - 20000 items, 11 - 20 items, 21 - 30 items)

我想按照与第一个数组相同的顺序对第二个数组进行排序,是否有一种简单的方法可以解决这个问题?

任何帮助将不胜感激。谢谢。

条件:

1)第二个阵列的大小可以不同。所以它的值可能比第一个数组少。

2)如果数据损坏,第二个数组可以包含第一个数组中不存在的值。

更新

我已根据Bergi的响应构建了一个示例:jsfiddle.net/EPwS6 - 但现在我需要弄清楚如何在arr2中保存arr1中不存在的值。任何想法或提示?

1 个答案:

答案 0 :(得分:2)

如果两个数组包含相同的项目,但顺序不同,则很容易:只需将第一个数组复制到第二个数组即可。使用直接引用,或slice创建新数组。

如果两个数组包含具有相似键的不同对象,则会变得更加困难。然而,您可以通过创建查找表轻松管理它:

var table = {};
for (var i=0; i<arr2.length; i++)
    table[ arr2[i].getKey() ] = arr2[i];
for (var i=0; i<arr1.length; i++)
    arr2[i] = table[ arr1[i].getKey() ];
table = null;
// arr2 now ordered by the same keys as arr1, and its length is set to arr1.length

如果密钥集不相同,您可能会使用以下内容:

var table = {};
for (var i=0; i<arr2.length; i++)
    table[ arr2[i].getKey() ] = arr2[i];
for (var i=0; i<arr1.length; i++) {
    var key = arr1[i].getKey();
    if (key in table) {
        arr2.push(table[key]); // add to array
        delete table[key]; // and prevent readding
    }
}
for (var key in table)
    arr2.push(table[key]); // add all leftover objects
table = null;