【问题标题】:Sort an array except the first item. Array.prototype.sort()对除第一项之外的数组进行排序。 Array.prototype.sort()
【发布时间】:2021-08-26 07:50:41
【问题描述】:

let array = [{
    name: 'first'
}, {
    name: 'd'
}, {
    name: 'cc'
}, {
    name: 'bbb'
}, {
    name: 'aaaa'
}]

let firstElement = array.shift()

// sort array by item name's length:

array.sort((a, b) => {
    return b.name.length - a.name.length
})

array.unshift(firstElement)

console.log(array)

我目前正在使用此代码,尽管我相信我可以通过在 array.sort() 的函数中实现此逻辑来摆脱 firstElement's .shift() 和稍后的 .unshift(),这样我就不必创建一个额外的数组。我已经尝试了在这里找到的几个答案,但到目前为止没有一个对我的用例有用。

【问题讨论】:

  • 您可能可以,但是对于所有正常用例,性能差异可能可以忽略不计。除非您要处理该数组中的大量数据,否则我真的不会打扰并专注于其他事情。
  • @georg 顺便说一句,这仍然会创建两个新数组,一个用于.slice(1),一个用于外部数组,因此它并不比 OP 已有的更好。我可能也会这样做,但只是为了可读性,而不是出于性能原因。

标签: javascript arrays sorting optimization logic


【解决方案1】:

您可以在 sort() 方法中检查非第一个元素:

let array = [{
    name: 'first'
}, {
    name: 'd'
}, {
    name: 'cc'
}, {
    name: 'bbb'
}, {
    name: 'aaaa'
}]

array.sort((a, b) => {
    if (a !== array[0] && b !== array[0]) { // Check if there are not first element
    return b.name.length - a.name.length
    }
})

【讨论】:

    【解决方案2】:

    仅使用 sort 函数实际上是不可能的,至少在包含任意数据的数组的一般情况下是这样。如果元素包含第一个元素的多个副本,则将传递给排序函数的值与this answer 中所做的第一个元素进行比较失败,例如:

    let x = {name:'first'};
    let array = [x,{name:'d'},{name:'cc'},{name:'bbb'},x,{name:'aaaa'}];
    
    array.sort((a, b) => {
        if (a !== array[0] && b !== array[0]) { // Check if there are not first element
        return b.name.length - a.name.length
        }
    });
    
    console.log(array);

    它可能适用于您的情况,因为您似乎有一个没有重复元素的对象数组,但对于更一般的情况,您必须比较索引,而不是元素 - 这是不可能使用 .sort 设计的.比较器函数通常应该只根据元素的值来比较元素,而不是其他任何东西。

    我通常会坚持你已经拥有的;性能差异最多是最小的,如果你决定在你的数组中添加重复项或引入其他类型,它不会容易中断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 2021-11-11
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多