按另一个索引数组排序数组

时间:2013-05-26 12:50:59

标签: javascript arrays sorting d3.js

我正在迭代数组,我需要按照另一对的顺序排序。

说我有这两个数组:

aLinks = [4,5,6]
bLinks = [1,2,3,4,5,6]

我需要回复:

aLinks = [4,5,6]
bLinks = [4,5,6,1,2,3]

意味着我需要首先匹配第一个数组的项目而不是其余的项目, 如果可能,按订单排序。

我正在使用d3,所以我使用forEach来浏览链接集并保存aLinks的顺序。

我不知道如何将此订单应用于bLinks

var linkOrder = [];

linkSets.forEach(function(set, i) {
  linkOrder = [];

  set.aLinks.forEach(function(link,i){
    linkOrder.push(link.path);
  })
});

3 个答案:

答案 0 :(得分:4)

你可以这样做:

  1. 将第二个数组中的匹配项取出到临时数组
  2. 排序临时数组
  3. 对仅包含不匹配项
  4. 的第二个数组进行排序
  5. 将第二个数组连接到临时数组
  6. 代码 - 使用用户提供的修补程序:basilikum

    var first = [4,5,6];
    var second = [1,7,3,4,6,5,6];
    var temp = [], i = 0, p = -1;
    
    // numerical comparator
    function compare(a, b) { return a - b; }
    
    // take out matching items from second array into a temp array
    for(i=0; i<first.length; i++) {
        while ((p = second.indexOf(first[i])) !== -1) {
            temp.push(first[i]);
            second.splice(p, 1);
        }
    }
    
    // sort both arrays
    temp.sort(compare);
    second.sort(compare);
    
    // concat
    temp = temp.concat(second);
    console.log(temp);
    

    工作演示http://jsfiddle.net/kHhFQ/

答案 1 :(得分:2)

最终得到A + sort(A-B) - 所以你只需要计算2个数组之间的差异。使用一些underscore便利方法,例如:

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

var diff = _.difference(A,B);

var result = _.flattern(A, diff.sort());

答案 2 :(得分:1)

迭代第一个数组,从第二个数组中删除值,然后将它们附加到数组的开头以获得正确的顺序:

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

arr1.sort(function(a,b) {return a-b;});

for (i=arr1.length; i--;) {
    arr2.splice(arr2.indexOf(arr1[i]), 1);
    arr2.unshift( arr1[i] );
}

FIDDLE