1

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

假设我有这两个数组:

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);
  })
});
4

3 回答 3

4

你可以这样做:

  1. 将第二个数组中的匹配项取出到临时数组中
  2. 对临时数组进行排序
  3. 对仅包含不匹配项的第二个数组进行排序
  4. 将第二个数组连接到临时数组中

代码-使用用户提供的修复: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/

于 2013-05-26T12:59:19.407 回答
2

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

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

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

var result = _.flattern(A, diff.sort());
于 2013-05-26T12:57:59.823 回答
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] );
}

小提琴

于 2013-05-26T12:58:30.653 回答