【问题标题】:JS: Sort a part of an array by orderJS:按顺序对数组的一部分进行排序
【发布时间】:2022-01-07 12:56:32
【问题描述】:

我的任务是按从另一个数组给出的特定顺序对随机数数组进行排序。所有其他无法排序的元素都应该放在结果数组的末尾:

const array = [6,1,2,3,4,5]
const sortOrder = [3,2,1]
const shouldSortTo = [3,2,1,6,4,5]

我有以下解决方案:

array.sort((a,b)=> {
  if(sortOrder.indexOf(a) === -1 && sortOrder.indexOf(b) > -1 ) {
    return 1  
  }
  if(sortOrder.indexOf(a) > -1 && sortOrder.indexOf(b) === -1 ) {
    return -1
  }
  return sortOrder.indexOf(a) - sortOrder.indexOf(b) 
})

它有效,但我觉得它不容易阅读或理解。有更好或更短的方法吗?

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    并不是说这更好或更有效,但是您可以先检查所有 sortOrder 项是否都在数组中,然后从数组中删除 sortOrder 项并将两者连接起来:

    const array = [6,1,2,3,4,5]
    const sortOrder = [3,2,1]
    const shouldSortTo = [3,2,1,6,4,5]
    
    let result = sortOrder.filter(s => array.includes(s)).concat(array.filter(i => !sortOrder.includes(i)))
    
    console.log(result)

    编辑: 根据@epascarello 的评论,如果数组包含重复值,这可能是一个更好的选择:

    const array = [6,1,2,3,4,5,2,3]
    const sortOrder = [3,2,1]
    
    let sorted = sortOrder.reduce((s, i) => [...s, ...array.filter(x => x === i)], [])
    let result = sorted.concat(array.filter(i => !sortOrder.includes(i)))
    
    console.log(result)

    【讨论】:

    • 这种方法的唯一缺点是它必须是 1 比 1,否则会失败。如果输入可以是const array = [6,1,2,3,4,5,2, 3],这将不起作用。
    • 非常好的点@epascarello!我会保留答案,但这应该是免责声明:)
    【解决方案2】:

    我不会继续查找索引。只需阅读一次并使用它。您可以将其应用到您自己的代码中。

    const array = [6,1,2,3,4,5]
    const sortOrder = [3,2,1]
    
    array.sort((a,b)=> {
      const aI = sortOrder.indexOf(a);
      const bI = sortOrder.indexOf(b);
    
      if (aI === -1 && bI > -1 ) return 1;
      else if (aI > -1 && bI === -1 ) return -1;
      return aI - bI; 
    })
    
    
    console.log(array);

    我会检查它们是否相等并返回零。 我会检查是否为-1。 最后我会根据索引进行排序。

    const array = [6,1,2,3,4,5]
    const sortOrder = [3,2,1]
    
    array.sort((a,b)=> {
      const aI = sortOrder.indexOf(a);
      const bI = sortOrder.indexOf(b);
    
      if (aI === bI) return 0;
      else if (aI === -1) return 1;
      else if (bI === -1) return -1;
      else return aI - bI;
    })
    
    console.log(array);

    其他选项,如果为-1,则设置为数组的长度并减去

    const array = [6,1,2,3,4,5]
    const sortOrder = [3,2,1]
    
    const max = array.length;
    array.sort((a,b)=> {
      const aI = sortOrder.indexOf(a);
      const bI = sortOrder.indexOf(b);
    
      return (aI === -1 ? max : aI) - (bI === -1 ? max : bI);
    })
    
    console.log(array);

    或者你可以保留逻辑

    const array = [6,1,2,3,4,5]
    const sortOrder = [3,2,1]
    
    const max = array.length;
    const reversed = sortOrder.slice().reverse();
    array.sort((a,b)=> {
      const aI =  max - reversed.indexOf(a);
      const bI =  max - reversed.indexOf(b);
      return aI - bI;
    })
    
    console.log(array);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多