根据带下划线的数组对对象进行排序

时间:2017-09-18 07:37:24

标签: javascript arrays underscore.js javascript-objects

我正在尝试将对象与数组进行排序。因此循环将在数组上查找特定值,直到找到一个,并将这3个元素放在开头,其余放在结尾。 我不确定这个想法的最佳方法是什么?

就是这样:

var arr = [1, 3, 2,4,5,6, 2]; 
var arrSimilar = [1,2,5]


var testSortBy = _.sortBy(arr, function(arrSimilar){    
  // [1,2,5,3,4,6,2]   
});

console.log(testSortBy); // [1,2,5,3,4,6,2]

2 个答案:

答案 0 :(得分:1)

您可以使用sorting with map并将similar数组的值索引作为priority排序,然后将所有其他值的索引作为顺序。

重要的是删除similar数组的已使用值,因为它现在正在使用中,并且对于其他类似值没有意义。这意味着,相同的值将按其原始相对索引进行排序。

var array = [1, 3, 2, 4, 5, 6, 2],
    similar = [1, 2, 5],
    result = array
        .map(function (a, i) {
            var priority = similar.indexOf(a);
            delete similar[priority]; // delete value, but keep the index of other items
            return { index: i, priority: (priority + 1) || Infinity };
        })
        .sort(function (a, b) {
            return a.priority - b.priority || a.index - b.index;
        })
        .map(function (o) {
            return array[o.index];
        });

console.log(result); // [1, 2, 5, 3, 4, 6, 2]

答案 1 :(得分:0)

您可以通过以下方式执行此操作

  1. 假设A []是原始数组,B是优先级数组
  2. 答案是(B交叉口A)concat(A-B)
  3. var arr = [1, 3, 2,4,5,6]; 
    var arrSimilar = [1,2,5];
    
    let bInterA = arrSimilar.filter((e) => arr.indexOf(e) != -1);
    
    let aDiffb = arr.filter((e) => arrSimilar.indexOf(e) == -1);
    
    console.log(bInterA.concat(aDiffb));