【问题标题】:Sort an object according to an array with underscore根据带下划线的数组对对象进行排序
【发布时间】:2017-09-18 07:37:23
【问题描述】:

我正在尝试对与数组进行比较的对象进行排序。因此,循环将在数组上查找特定值,直到找到一个,然后将这 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]

【问题讨论】:

  • 两个2s 在结果数组中作为元素包含在哪里?
  • 是的,他们可以重复
  • 为什么预期结果中没有两个5s?
  • 有人改变我的问题...假设有两个 2

标签: javascript arrays underscore.js javascript-objects


【解决方案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]

【讨论】:

  • 有意思我去试试
  • 这比我尝试的任何方法都更有意义!...谢谢!
【解决方案2】:

你可以通过以下方式做到这一点

  1. 假设A[]为原始数组,B为优先数组
  2. 答案是(B 交点 A)concat (A-B)

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

【讨论】:

    猜你喜欢
    • 2016-10-09
    • 2016-08-05
    • 1970-01-01
    • 2015-12-30
    • 2013-11-25
    • 2020-12-15
    • 2018-06-03
    • 2019-03-28
    • 1970-01-01
    相关资源
    最近更新 更多