下划线:sortBy最低价格,除非超过2或相同的价格,然后sortBy日期......等

时间:2017-02-02 21:48:12

标签: javascript underscore.js

所以我使用了下划线sortBy,我按最低成本排序JSON对象数组......效果很好。

客户也想要的是:

“如果两个或多个结果的成本相同,那么收集点的顺序应该是以下优先级(最高优先级)

最低价格(默认) - 独特价格时 与搜索位置的距离 最早的收集日期“

这样的事情可能吗?

如果您有10个项目的列表和 2是1英镑, 2是2英镑, 2是3英镑, 2是4英镑, 2是5英镑 这不是最终有点疯狂试图找出排序优先级吗?

2 个答案:

答案 0 :(得分:0)

看看this answer to a (very) similar question

还有一个更简单的版本,courtesy of Janet Riley

var fullySorted = _.sortBy(( _.sortBy(list, 'collectionDate')), 'price');

var fullySorted =  _.chain(list).sortBy('collectionDate').sortBy('price').value();

答案 1 :(得分:0)

在这种情况下,我实际上更喜欢使用Array.prototype.sort,因为它允许您设置自定义比较器函数,这将允许您在不进行多次传递或使用hacky变通方法的情况下对数组进行排序。 / p>

这是一个相对简单的比较器实现,它允许您指定要比较的几个函数(或属性),如果两个对象根据一个函数相等,则将使用下一个函数。

const items = [{
  cost: 1,
  prioritiy: 1
}, {
  cost: 2,
  prioritiy: 1
}, {
  cost: 1,
  prioritiy: 2
}];
items.sort(by('cost', 'priority'));
console.log(items);

function by(...args) {
  const funcs = args.map(arg =>
    typeof arg === 'function' ? arg : obj => obj[arg]
  );
  const compare = (val1, val2) => {
    return typeof val1 === 'string' &&
           typeof val2 === 'string'
             ? val1.localeCompare(val2)
             : val1 - val2;
  };
  return (a, b) => {
    for (let i = 0; i < funcs.length; i++) {
      let comp = compare(funcs[i](a), funcs[i](b));
      if (comp !== 0) {
        return comp;
      }
    }
    return 0;
  };
}

此外,Lodash是Underscore的替代库,其中_.sortBy具有此行为。