【问题标题】:How to convert array of objects into array with changed positions如何将对象数组转换为位置改变的数组
【发布时间】:2021-07-27 14:12:18
【问题描述】:

我有一个对象数组:

[
    { id: 'ade', value: 8 },
    { id: 'rtl', value: 17 },
    { id: 'enu', value: 11 }
]

并希望将其转换为:

[
    { id: 'enu', value: 11 },
    { id: 'rtl', value: 17 },
    { id: 'ade', value: 8 },
]

但我不能反转它等,因为我必须设置一个声明,即项目 { id: 'ade', value: 8 } 应该是最后一个项目,其余的必须按 id 排序。

我尝试减少第一个数组并与第二个数组连接

const firstArr = arr.reduce((acc, cv) => {
    if (cv.id === 'ade') {
        acc.push(cv)
    }
    return acc
}, []))

const second = arr.splice(firstArr, 1).sort()

firstArr.concat(second)

但它失败了,似乎过度设计。我想做得更聪明。有什么想法吗?

请给点建议!!

【问题讨论】:

    标签: javascript arrays sorting


    【解决方案1】:

    您可以使用扩展运算符使代码看起来更短, 但这是相同的逻辑:

    const arr = //...your array of data
    const parsedArr = [...arr.filter(o => o.id !== 'ade').sort((a, b) => a.id.localeCompare(b.id)), ...arr.filter(o => o.id === 'ade')];
    

    所以第一部分是所有数组元素,最后没有你需要的特定元素,第二部分是最后一个元素。

    希望我能帮上忙:)

    【讨论】:

    • 但这不会按要求按id属性对其他对象进行排序,输出与示例数组所需的输出匹配只是巧合。
    • 你说得对,我添加了一个 localCompare 函数用于排序,谢谢!
    【解决方案2】:

    您可以使用自己的规则过滤、排序然后连接数组:

    let orig = [
        { id: 'ade', value: 8 },
        { id: 'rtl', value: 17 },
        { id: 'enu', value: 11 }
    ]
    
    sorted = orig.filter(e => e.id !== 'ade').sort((a, b) => 
       a.id.localeCompare(b.id)
    ).concat(orig.find(e => e.id === 'ade'))
    
    console.log(sorted)

    【讨论】:

    • 该排序函数不会产生问题中所需的结果。
    • 谢谢。已编辑。
    【解决方案3】:
    [
        { id: 'ade', value: 8 },
        { id: 'rtl', value: 17 },
        { id: 'enu', value: 11 },
    ].sort((a,b) => a.id == 'ade' ? 1 : b.id == 'ade' ? -1 : a.id > b.id ? 1 : -1)
    

    【讨论】:

    • 不建议发布纯代码答案,答案应提供有关代码的更多解释,使其答案更有用,更有可能吸引投票From Review
    【解决方案4】:

    您可以在传递给sort() 的回调中提供自定义逻辑,以处理id === 'ade' 与其他元素不同的元素。

    如果id 等于“ade”,则返回布尔值的差值,否则使用localeCompare 比较两个id。

    const arr = [
      { id: 'ade', value: 8 },
      { id: 'rtl', value: 17 },
      { id: 'enu', value: 11 }
    ];
    
    const sortedArr = [...arr].sort((a, b) => (
      (a.id === 'ade' || b.id === 'ade')
        ? (a.id === 'ade') - (b.id === 'ade')
        : a.id.localeCompare(b.id)));
    
    console.log(sortedArr)
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    示例 – 对于a = 'ade'b = 'rtl',通过将它们与ade 进行比较返回的布尔值的差异返回1,它将b 排序在a 之前,因此推动@ 987654334@向下。

    (('ade'==='ade') - ('rtl' === 'ade')) -> (true - false) -> (1 - 0) -> 1 
    

    【讨论】:

      【解决方案5】:

      您可以使用Array.prototype.localeCompare 处理您的情况

      let arr = [
        { id: 'ade', value: 8 },
        { id: 'rtl', value: 17 },
        { id: 'enu', value: 11 }
      ]
      arr.sort((a,b) => `${a.value}`.localeCompare(`${b.value}`))
      
      console.log(arr)

      【讨论】:

        【解决方案6】:

        对于这种特殊情况,您可以使用自定义sort 函数:

        const sortedArr = [...arr].sort((a, b) => {
            return b.id.localeCompare(a.id)
        })
        

        但是如果arr中的对象会比较多就需要重构排序函数

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-03
          • 2018-12-04
          • 2021-06-16
          相关资源
          最近更新 更多