当我们需要对一个数组进行排序时,通常会使用JavaScript内置的 sort
函数。但是,如果我们希望根据特定的指标来排序,该怎么办呢?这时候就可以考虑使用Underscore.js提供的 sortBy
和 sortByOrder
函数。
sortBy函数
sortBy
函数接受两个参数:待排序的数组和一个迭代器函数。迭代器函数用于从数组中提取每个元素的排序指标,它应该返回一个数字、字符串或者其他可比较类型的值。下面是一个示例:
-- -------------------- ---- ------- ----- ---- - - - ----- -------- ---- -- -- - ----- ------ ---- -- -- - ----- ---------- ---- -- - -- ----- ---------- - -------------- ------ -- ---------- ------------------------ -- ------- -- ----- ------ ---- -- -- - ----- -------- ---- -- -- - ----- ---------- ---- -- --
在上面的示例中,我们根据每个对象的 age
属性来进行排序。
需要注意的是,如果迭代器函数返回的是一个字符串,那么排序将会按照字典序进行。如果要进行反向排序,则可以用 -
符号将迭代器函数的返回值取负数,例如:
const data = ["b", "a", "c"]; const sortedData = _.sortBy(data, (item) => -item); console.log(sortedData); // Output: ["c", "b", "a"]
sortByOrder函数
sortByOrder
函数与 sortBy
函数类似,不同的是它可以指定排序的方向。第二个参数是一个字符串数组,用于指定排序的顺序。每个字符串表示一个排序指标,前面加上 -
表示按照降序进行排序。下面是一个示例:
-- -------------------- ---- ------- ----- ---- - - - ----- -------- ---- -- -- - ----- ------ ---- -- -- - ----- ---------- ---- -- - -- ----- ---------- - ------------------- ------- ---------- ------------------------ -- ------- -- ----- ------ ---- -- -- - ----- -------- ---- -- -- - ----- ---------- ---- -- --
在上面的示例中,我们首先根据 age
属性进行升序排序,然后在相同 age
值的元素中再按照 name
属性进行降序排序。
需要注意的是,如果对于某个元素,所有指标都相同,那么它们的顺序可能是不确定的。为了避免这种情况,可以在最后再添加一个唯一的排序指标,例如:
-- -------------------- ---- ------- ----- ---- - - - ----- -------- ---- -- -- - ----- ------ ---- -- -- - ----- ---------- ---- -- - -- ----- ---------- - ------------------- ------- -------- ------- ------------------------ -- ------- -- ----- ------ ---- --- --- - -- - ----- -------- ---- --- --- - -- - ----- ---------- ---- --- --- - --
在上面的示例中,我们添加了一个名为 id
的属性作为最后的排序指标,以保证排序结果的确定性。
总结
使用Underscore.js提供的 sortBy
和 sortByOrder
函数可以方便地进行复杂的排序操作。需要注意的是,为了保证排序结果的确定性,应该定义好唯一的排序指标。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/11658