使用动态嵌套属性键对数组中的对象进行排序

Tho*_*ore 9 javascript arrays sorting object ecmascript-6

我正在尝试对嵌套对象数组进行排序.它使用静态选择键,但我无法弄清楚如何动态获取它.

到目前为止,我已经有了这段代码

sortBy = (isReverse=false) => {
    this.setState(prevState => ({
        files: prevState.files.sort((a, b) => {
            const valueA = (((a || {})['general'] || {})['fileID']) || '';
            const valueB = (((b || {})['general'] || {})['fileID']) || '';

            if(isReverse) return valueB.localeCompare(valueA);

            return valueA.localeCompare(valueB);
        })
    }));
}
Run Code Online (Sandbox Code Playgroud)

此时键是硬编码的,['general']['orderID']但我想通过向函数添加一个keys参数来使这部分变为动态sortBy:

sortBy = (keys, isReverse=false) => { ...
Run Code Online (Sandbox Code Playgroud)

keys是一个嵌套键的数组.对于上面的例子,它将是['general', 'fileID'].

为实现这一目标需要采取哪些步骤?

注意:子对象可能是未定义的,因此我正在使用 a || {}

注2:我正在使用es6.没有外部包.

Shi*_*rsz 1

一种方法是在新参数上使用reduce()keys,如下所示:

sortBy = (keys, isReverse=false) =>
{
    this.setState(prevState =>
    ({
        files: prevState.files.slice().sort((a, b) =>
        {
            const valueA = (keys.reduce((acc, key) => (acc || {})[key], a) || '').toString();
            const valueB = (keys.reduce((acc, key) => (acc || {})[key], b) || '').toString();
            return (isReverse ? valueB.localeCompare(valueA) : valueA.localeCompare(valueB));
        })
    }));
}
Run Code Online (Sandbox Code Playgroud)