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