繁体   English   中英

Javascript 按数组的嵌套 object 排序

[英]Javascript sort by nested object of array

    {
        "a": [
            {
            "value1": 34,
            "value2": 44
            },
            {
            "value1": 33,
            "value2": 10
            },
            {
            "value1": 52,
            "value2": 53
            }
        ],
        "b": [
            {
            "value1": 12,
            "value2": 43
            },
            {
            "value1": 23,
            "value2": 78
            },
            {
            "value1": 98,
            "value2": 36
            }
        ],
        "c": [
            {
            "value1": 56,
            "value2": 90
            },
            {
            "value1": 76,
            "value2": 50
            },
            {
            "value1": 20,
            "value2": 30
            }
        ]
    }

这是我的数据。 我正在尝试按数组的最后一个 object 的“value2”对这些数据进行排序。

所以。 这里“c”的“value2”是 30,它很小,所以 object 应该排在第一位。

预期结果是:

["c", "b", "a"]

所以“value2”的顺序是 30 然后 36 然后 53

我想不出任何办法来做到这一点,所以没有尝试就在这里问。

请看看我们如何实现这一目标。

你可以这样做

 const data = { a: [ { value1: 34, value2: 44, }, { value1: 33, value2: 10, }, { value1: 52, value2: 53, }, ], b: [ { value1: 12, value2: 43, }, { value1: 23, value2: 78, }, { value1: 98, value2: 36, }, ], c: [ { value1: 56, value2: 90, }, { value1: 76, value2: 50, }, { value1: 20, value2: 30, }, ], }; const sortData = (data) => { const obj = {}; for (const i in data) { obj[i] = data[i][data[i].length - 1]["value2"]; } return Object.entries(obj).sort(([, a], [, b]) => a - b).reduce((r, [k]) => ({...r, [k]: data[k] }), {}); }; const res = sortData(data); console.log(res);

从本质上讲,对象本身并没有保证的排序顺序,但是,我们可以尝试解决在大多数情况下应该可行的问题。

Objects don't have a .sort() method, but we can use Object.entries() to temporarily convert the object to an array, apply our desired sorting logic, and then reconvert the final product to an object using Object.fromEntries() .

这应该可以满足您的需求:

const sortObjectByValue2 = obj => Object.fromEntries(Object.entries(obj).sort((a,b) => a[1].slice().reverse()[0].value2 - b[1].slice().reverse()[0].value2));

这是在行动:

 const sortObjectByValue2 = obj => Object.fromEntries(Object.entries(obj).sort((a,b) => a[1].slice().reverse()[0].value2 - b[1].slice().reverse()[0].value2)); const values = { a: [{ value1: 34, value2: 44 }, { value1: 33, value2: 10 }, { value1: 52, value2: 53 }], b: [{ value1: 12, value2: 43 }, { value1: 23, value2: 78 }, { value1: 98, value2: 36 }], c: [{ value1: 56, value2: 90 }, { value1: 76, value2: 50 }, { value1: 20, value2: 30 }] } console.log(sortObjectByValue2(values));

有关Object.entries()Object.fromEntries()的更多信息,请访问以下链接:

我认为您可以将 object 的键存储到一个数组中,然后按 object 值对数组进行排序。 可以使用如下代码:

const unordered  = {
    "a": [
        {
        "value1": 34,
        "value2": 44
        },
        {
        "value1": 33,
        "value2": 10
        },
        {
        "value1": 52,
        "value2": 53
        }
    ],
    "b": [
        {
        "value1": 12,
        "value2": 43
        },
        {
        "value1": 23,
        "value2": 78
        },
        {
        "value1": 98,
        "value2": 36
        }
    ],
    "c": [
        {
        "value1": 56,
        "value2": 90
        },
        {
        "value1": 76,
        "value2": 50
        },
        {
        "value1": 20,
        "value2": 30
        }
    ]
};

let ordered = Object.keys(unordered).sort((k1,k2)=>{
        let arr1 = unordered[k1];
        let arr2 = unordered[k2];
        if(arr1[arr1.length-1]["value2"]>arr2[arr2.length-1]["value2"]){
            return 1;
        }else{
            return -1;
        }
    });

console.log(ordered);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM