Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/376.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何对具有动态属性的数组进行排序?_Javascript_Arrays_Reactjs_Sorting_Properties - Fatal编程技术网

Javascript 如何对具有动态属性的数组进行排序?

Javascript 如何对具有动态属性的数组进行排序?,javascript,arrays,reactjs,sorting,properties,Javascript,Arrays,Reactjs,Sorting,Properties,我有一个电影数组,我试图根据标记为“path”的动态值对其进行排序,该值根据当前状态计算为“title”、“genre.name”、“numberStock”或“dailyRentalRate”。但是,由于movies数组中的'genre'属性是一个对象,而不像其他属性那样是一个字符串,因此我编写的比较函数尝试访问movieA(“genre.name”)和movieB(“genre.name”)。我原以为这种语法可能有效,但事实并非如此。当然,一定有一种优雅的方式来编写我的比较函数,当path设

我有一个电影数组,我试图根据标记为“path”的动态值对其进行排序,该值根据当前状态计算为“title”、“genre.name”、“numberStock”或“dailyRentalRate”。但是,由于movies数组中的'genre'属性是一个对象,而不像其他属性那样是一个字符串,因此我编写的比较函数尝试访问movieA(“genre.name”)和movieB(“genre.name”)。我原以为这种语法可能有效,但事实并非如此。当然,一定有一种优雅的方式来编写我的比较函数,当path设置为“genre.name”时,它不需要添加更多的条件。非常感谢您提供的任何帮助或见解。谢谢。(下面是一些代码片段)

var电影=[
{
标题:“终结者”,
体裁:{u id:“5b21ca3eeb7f6fbccd471818”,名称:“动作”},
库存数量:6,
Dailrentalrate:2.5,
},
{
标题:“死硬”,
体裁:{u id:“5b21ca3eeb7f6fbccd471818”,名称:“动作”},
库存数量:5,
dailyRentalRate:2.5
},
{
标题:“滚出去”,
类型:{u id:“5b21ca3eeb7f6fbccd471820”,名称:“Thriller”},
库存数量:8,
Dailrentalrate:3.5
}
]
此.state={
路径:“title”/“title”或“genre.name”或“numberInStock”或“dailyRentalRate”
};
myCompare=(a,b)=>{
const path=this.state.path;
if(a[path]b[path])返回1;
返回0;
}
const moviesorted=movies.sort(this.myCompare);

当路径包含句点时,应使用
split
将其转换为一个数组,然后使用
reduce
对其进行迭代,并找到要按其排序的嵌套值:

var电影=[
{
标题:“富吧”,
类型:{u id:“5b21ca3eeb7f6fbccd471820”,名称:“Thriller”},
库存数量:8,
dailyRentalRate:3
},
{
标题:“终结者”,
体裁:{u id:“5b21ca3eeb7f6fbccd471818”,名称:“动作”},
库存数量:6,
Dailrentalrate:2.5,
},
{
标题:“死硬”,
体裁:{u id:“5b21ca3eeb7f6fbccd471818”,名称:“动作”},
库存数量:5,
dailyRentalRate:2
},
{
标题:“滚出去”,
类型:{u id:“5b21ca3eeb7f6fbccd471820”,名称:“Thriller”},
库存数量:8,
Dailrentalrate:3.5
}
];
让path=“title”;
const getNested=(obj,path)=>path.split('.').reduce((a,prop)=>a[prop],obj);
常量myCompare=(a,b)=>{
const aVal=getNested(a,路径);
返回aVal的类型==='string'
?aVal.localeCompare(getNested(b,路径))
:aVal-getNested(b,路径);
};
//按标题排序:
电影。排序(myCompare);
console.log(电影);
//按流派排序。名称:
路径='genre.name';
电影。排序(myCompare);

console.log(movies);
也许,您可以编写一个助手函数来获取嵌套值,如下所示:

function getNestedValue(fieldName, item) {
    if (fieldName.includes('.')) {
        const keyArr = fieldName.split('.');
        let result = item;
        if (keyArr.length > 1) {
            for (const key of keyArr) {
                result = result[key];
            }

            return result;
        }
    }

    return item[fieldName];
}

myCompare = (a, b) => {
    const { path } = this.state.sortColumn;
    const valueA = getNestedValue(path, a);
    const valueB = getNestedValue(path, b)

    if (valueA < valueB) return - 1;
    if valueA > valueB) return 1;
    return 0;
}
函数getNestedValue(字段名,项){ if(fieldName.includes('.')){ const keyArr=fieldName.split('.'); 让结果=项目; 如果(键arr.length>1){ for(keyArr的常数键){ 结果=结果[键]; } 返回结果; } } 返回项目[字段名]; } myCompare=(a,b)=>{ const{path}=this.state.sortColumn; const valueA=getNestedValue(路径,a); 常量值b=getNestedValue(路径b) 如果(valueAvalueB)返回1; 返回0; } 并与给出的结果进行比较

function getNestedValue(fieldName, item) {
    if (fieldName.includes('.')) {
        const keyArr = fieldName.split('.');
        let result = item;
        if (keyArr.length > 1) {
            for (const key of keyArr) {
                result = result[key];
            }

            return result;
        }
    }

    return item[fieldName];
}

myCompare = (a, b) => {
    const { path } = this.state.sortColumn;
    const valueA = getNestedValue(path, a);
    const valueB = getNestedValue(path, b)

    if (valueA < valueB) return - 1;
    if valueA > valueB) return 1;
    return 0;
}