循环对象的对象以存储对象密钥

问题描述

我从Firebase获取一个对象,但是需要更改认项目顺序。为此,我使用Lodash orderBy()方法

computed: {
  sortedLogs() {
    return orderBy(this.logs,'date','desc')
  }
},

现在的问题是此方法删除对象键,我需要这些键来管理项目删除请求。

原始

{
    MFVMHJHnbpr: {
        date: 1598270895
        side: 'l'
    },MFVMblsdfdPb: {
        date: 1598270825
        side: 'r'
    },MsxvblsdfdPb: {
        date: 1598271225
        side: 'l'
    },}

orderBy()

之后
{
    0: {
        date: 1598270895
        side: 'l'
    },1: {
        date: 1598270825
        side: 'r'
    },2: {
        date: 1598271225
        side: 'l'
    },}

解决方法

您也可以使用普通JavaScript进行操作,但是如果要依赖元素的顺序,则必须将对象转换为数组。不能保证对象在JavaScript中具有规定的顺序(请参见here)。

const inp= {
    MFVMHJHnbpr: {
        date: 1598270895,side: 'l'
    },MFVMblsdfdPb: {
        date: 1598270825,side: 'r'
    },MsxvblsdfdPb: {
        date: 1598271225,side: 'l'
    }
};
const out=Object.entries(inp).map(o=>(o[1].key=o[0],o[1])).sort((a,b)=>a.date-b.date)
console.log('Array:',out);

// alternatively,creating a "sorted object" - no guarantee!

const outObj=out.reduce((a,c)=>{let o={...c}; delete o.key; a[c.key]=o; return a;},{})
console.log('Object:',outObj);

,

orderBy不会改变原始对象,因此您可以存储this.logs的副本并将其用于删除。当然,这意味着您还必须在更改原始数据后更新sortedLogs