是否可以使用sort()以这种特定方式对对象数组进行排序?

时间:2017-03-16 15:44:23

标签: javascript arrays sorting

很抱歉没有在标题中加入特定的排序,但我无法正确说出来。

我正在排序一个文件对象列表,其中包含名称,上传日期和类别等详细信息,我需要对其进行排序,使上次上传的文件推送到顶部,其余文件都是'排序。

例如,如果我按最低顺序将列表从最旧到最新排序,我仍然希望最新的列表位于顶部。

从数据库返回时,列表已按类别,日期等排序,因此我只需要进一步对其进行排序。

必须在传递给sort()的函数中完成。

3 个答案:

答案 0 :(得分:1)

有很多解决方案。作为最简单的解决方案,您可以使用https://lodash.com/docs/4.17.4#orderBy

之类的内容

答案 1 :(得分:0)

您只需复合排序算法即可实现此目的:

sortingLabels = ["date uploaded", "category", "date"]
myArray.sort((a,b) => {
  for (l of sortingLabels) {
    const comparison = compare(a,b,l)
    if (comparison == 0) {continue}
    return comparison
  }
})

现在,您所要做的就是实现compare(a,b,label)函数,该函数根据-1返回10label

注意: for循环for-of适用于ES2015 +,它是最现代的浏览器和Node.js.但是,如果您需要支持显着较旧的浏览器,则可能需要考虑使用常规for-loop

答案 2 :(得分:0)

from_product不一定稳定,只要你在第一个结果中按一个属性排序。

您需要另一个值才能将相等(生成id)个项目移到正确的位置,此处的附加值为var data = [{ id: 0, date: '2017-01-01' }, { id: 2, date: '2017-01-01' }, { id: 5, date: '2017-01-02' }, { id: 6, date: '2017-01-05' }, { id: 9, date: '2017-01-06' }, { id: 19, date: '2017-01-11' }, { id: 24, date: '2017-02-01' }, { id: 67, date: '2017-02-01' }, { id: 80, date: '2017-02-11' }, { id: 90, date: '2017-02-21' }, { id: 101, date: '2017-02-23' }, { id: 149, date: '2017-02-28' }, { id: 163, date: '2017-03-01' }, { id: 190, date: '2017-03-02' }, { id: 321, date: '2017-03-05' }, { id: 444, date: '2017-03-17' }], lastDate = data[data.length - 1].date; data.sort(function (a, b) { return (b.date === lastDate) - (a.date === lastDate); }); console.log(data); data.sort(function (a, b) { return (b.date === lastDate) - (a.date === lastDate) || a.id - b.id; }); console.log(data);,这些值均为创建顺序。< / p>

.as-console-wrapper { max-height: 100% !important; top: 0; }
var data = [{ id: 0, date: '2017-01-01' }, { id: 2, date: '2017-01-01' }, { id: 5, date: '2017-01-02' }, { id: 6, date: '2017-01-05' }, { id: 9, date: '2017-01-06' }, { id: 19, date: '2017-01-11' }, { id: 24, date: '2017-02-01' }, { id: 67, date: '2017-02-01' }, { id: 80, date: '2017-02-11' }, { id: 90, date: '2017-02-21' }, { id: 101, date: '2017-02-23' }, { id: 149, date: '2017-02-28' }, { id: 163, date: '2017-03-01' }, { id: 190, date: '2017-03-02' }, { id: 321, date: '2017-03-05' }, { id: 444, date: '2017-03-17' }];

data.unshift(data.pop());
console.log(data);

另一种解决方案是,将Array#sort用于最后一项,将Array#pop用于插入数组的顶部位置。

.as-console-wrapper { max-height: 100% !important; top: 0; }
// The 3rd party Java 7 class
public class Fizz {
    private Foo foo;
    private Buzz buzz;

    public Fizz() {
        // ...
    }

    public Fizz(Buzz buzz) {
        // ...
    }

    // Getters and setters for foo + buzz down here
}

// My Scala classes
abstract class Bar(val foo : Foo) extends Fizz {
  // So I want my Bar API to accept a Foo, create an instance of Fizz via
  // its no-arg ctor, and then call setFoo(...) with the foo accepted here.
}

class SkyBar extends Bar {
  // ...
}

class SpaceBar extends Bar {
  // ...
}