Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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_Sorting - Fatal编程技术网

Javascript 如何利用键和排序顺序实现嵌套数组的排序

Javascript 如何利用键和排序顺序实现嵌套数组的排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我试图基于键和排序顺序在嵌套数组上实现多重排序 我能够根据键和顺序对数组进行排序 我已经完成了以下数组排序代码 return array.sort((a, b) => { let i = 0, result = 0; while (i < sortBy.length && result === 0) { if (typeof a[sortBy[i].prop] == "string") { result =

我试图基于键和排序顺序在嵌套数组上实现多重排序

我能够根据键和顺序对数组进行排序

我已经完成了以下数组排序代码

return array.sort((a, b) => {
      let i = 0, result = 0;
      while (i < sortBy.length && result === 0) {
        if (typeof a[sortBy[i].prop] == "string") {
          result = sortBy[i].direction * (a[sortBy[i].prop].toString() < b[sortBy[i].prop].toString() ? -1 : (a[sortBy[i].prop].toString() > b[sortBy[i].prop].toString() ? 1 : 0));
        } else {
          result = sortBy[i].direction * (a[sortBy[i].prop] < b[sortBy[i].prop] ? -1 : (a[sortBy[i].prop] > b[sortBy[i].prop] ? 1 : 0));
        }
        i++;
      }
      return result;
    });
我希望输出如下所示

array = [{ x: [{ d: 5 }, { d: 6 }, { d: 7 }, { d: 8 }], b: 's' },{ x: [{ d: 1 }, { d: 2 }, { d: 3 }, { d: 4 }], b: 'v' }];
但我得到的结果如下

array = [{ x: [{ d: 8 }, { d: 7 }, { d: 5 }, { d: 6 }], b: 's' },{ x: [{ d: 4 }, { d: 2 }, { d: 3 }, { d: 1 }], b: 'v' }];

我被困在如何解决这个逻辑问题上。有人能帮我吗。

你很接近了,你要做的是在属性为
x
的内部数组上调用排序方法。然后后记在原始数组中调用它。这将首先使用
d
属性对子数组进行排序,然后再根据
b
对外部数组进行排序

array=[{x:[{d:4},{d:2},{d:3},{d:1}],b:'v'},{x:[{d:8},{d:7},{d:5},{d:6}],b:'s'};
sortBy=[{'prop':'b','direction':1},{'prop':'d','direction':1}];
函数sortFunc(a,b){
设i=0,结果=0;
而(ib[sortBy[i].prop].toString()?1:0);
}否则{
结果=sortBy[i].方向*(a[sortBy[i].prop]b[sortBy[i].prop]?1:0);
}
i++;
}
返回结果;
}
forEach(arr=>arr.x=arr.x.sort(sortFunc));
array=array.sort(sortFunc);
console.log(数组);

据我所知,您需要使此函数递归,并在每次命中对象中的数组时调用该函数。看看这个

让输入=[
{x:[{d:4},{d:2},{d:3},{d:1}],b:'v'},
{x:[{d:8},{d:7},{d:5},{d:6}],b:'s}
];
常量排序说明=[
{prop'b',方向:1},
{prop'd',方向:1}
];
常量isArray=Obj=>{
返回typeof(Obj)=='object'&&Obj.length!==未定义
}
const nestedSort=SortingArray=>{
for(设排序数组的对象){
for(对象的let键。键(obj)){
if(isArray(对象[键]){
嵌套排序(对象[key])
}
}  	
}
for(let排序指令的指令){
排序数组。排序((a,b)=>{
if(typeof(a[instruction.prop])==“string”){
返回指令.direction*b[instruction.prop].localeCompare(a[instruction.prop])
}
if(typeof(a[instruction.prop])==“number”){
返回指令.direction*(b[instruction.prop]-a[instruction.prop]);
}
})
}
返回排序数组;
}
嵌套排序(输入);

控制台日志(输入)您的“逻辑”问题是,您不希望对一个数组进行排序,而是希望以两种不同的方式(通过不同的属性)对三个数组进行排序。或者属性d是否会像以下输入一样隐藏=[{x:[{b:[{d:1}]}];是的,托马斯。我需要首先根据属性“b”按升序对数组进行排序,然后根据数组“x”按升序对属性“d”进行排序。您知道,
x
是下一个要排序的属性吗?@relief.melone该结构有时会像以下输入那样更改=[{b:'',x:[]}。但是将不会有输入=[{x:[{b:[{d:1}]}]}]的隐藏情况;
array = [{ x: [{ d: 8 }, { d: 7 }, { d: 5 }, { d: 6 }], b: 's' },{ x: [{ d: 4 }, { d: 2 }, { d: 3 }, { d: 1 }], b: 'v' }];