Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/428.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/8/sorting/2.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_Sorting_Lodash - Fatal编程技术网

Javascript 如何根据外部条件和对象的属性对数组中的对象进行排序?

Javascript 如何根据外部条件和对象的属性对数组中的对象进行排序?,javascript,sorting,lodash,Javascript,Sorting,Lodash,我正在使用lodash.orderBy方法,并尝试对数据进行如下排序: 我有两个外部排序条件:条件1和条件2 const condition1='aa'; const condition2='b'; 常数数据=[ {f1:'aaa',f2:'b',f3:'2019-01-01'}, {f1:'a',f2:'b',f3:'2019-01-02'}, {f1:'a',f2:'c',f3:'2019-01-08'}, {f1:'aa',f2:'b',f3:'2019-01-08'}, {f1:'aa'

我正在使用lodash.orderBy方法,并尝试对数据进行如下排序:

我有两个外部排序条件:条件1和条件2

const condition1='aa'; const condition2='b'; 常数数据=[ {f1:'aaa',f2:'b',f3:'2019-01-01'}, {f1:'a',f2:'b',f3:'2019-01-02'}, {f1:'a',f2:'c',f3:'2019-01-08'}, {f1:'aa',f2:'b',f3:'2019-01-08'}, {f1:'aa',f2:'b',f3:'2019-01-09'}, {f1:'aa',f2:'c',f3:'2019-01-07'}, {f1:'xxx',f2:'c',f3:'2019-01-03'}, {f1:t',f2:d',f3:2019-01-04'}, {f1:'a',f2:'d',f3:'2019-01-01'}, {f1:'aa',f2:'d',f3:'2019-01-02'}, ]; 我希望数据排序如下:

常量预期=[ {f1:'aa',f2:'b',f3:'2019-01-09'}, {f1:'aa',f2:'b',f3:'2019-01-08'}, {f1:'aa',f2:'c',f3:'2019-01-07'}, {f1:'aa',f2:'d',f3:'2019-01-02'}, {f1:'a',f2:'b',f3:'2019-01-02'}, {f1:'aaa',f2:'b',f3:'2019-01-01'}, {f1:'a',f2:'c',f3:'2019-01-08'}, {f1:t',f2:d',f3:2019-01-04'}, {f1:'xxx',f2:'c',f3:'2019-01-03'}, {f1:'a',f2:'d',f3:'2019-01-01'}, ]; 排序规则是:

如果f1的值等于条件1-优先级1,则按f1排序 按f2排序如果f1相同,f2的值应等于条件2-优先级2 f1和f2相同时按f3desc排序-优先级3 优先级1是最高的


我想不出来。谢谢你的帮助。lodash.orderBy和javascript的排序方法,这两种解决方案都可以。

我不确定我是否完全理解您的问题,但在我看来,javascript排序函数与自定义排序函数相结合就是您所需要的

类似这样的未测试代码:

datas.sort(function(a, b) {
  if (a.f1 === condition1) {
    return a.f1.localeCompare(b.f1);
  } else if (a.f2 === condition2) {
    return a.f2.localeCompare(b.f2);
  } else {
    return a.f3.localeCompare(b.f3);
  }
});

我找到了一个解决方案,但看起来非常冗长

它是't1',=>{ 常数目标='aa'; const channelNme='b'; 常数数据=[ {目标:'aaa',频道名称:'b',日期:'2019-01-01'}, {目标:'a',频道:'b',日期:'2019-01-02'}, {目标:'a',频道:'c',日期:'2019-01-08'}, {目标:'aa',频道:'b',日期:'2019-01-08'}, {目标:'aa',频道:'b',日期:'2019-01-09'}, {目标:'aa',频道:'c',日期:'2019-01-07'}, {目标:'xxx',频道名称:'c',日期:'2019-01-03'}, {目标:'t',频道:'d',日期:'2019-01-04'}, {目标:'a',频道名称:'d',日期:'2019-01-01'}, {目标:'aa',频道名称:'d',日期:'2019-01-02'}, ]; const aa=datas.filterd=>d.goal==goal.sortsortByDateDesc; const notAa=datas.filterd=>d.goal!==goal.sortsortByDateDesc; const notAaB=notAa.filterd=>d.channelNme===channelNme.sortsortByDateDesc; const notAaNotB=notAa.filterd=>d.channelNme!==channelNme.sortsortByDateDesc; 常量实际值=[…aa,…notAaB,…NOTANOTB]; 函数sortByDateDesca,b{ 返回new Dateb.date.getTime-new Datea.date.getTime; } 常量预期值=[ {目标:'aa',频道:'b',日期:'2019-01-09'}, {目标:'aa',频道:'b',日期:'2019-01-08'}, {目标:'aa',频道:'c',日期:'2019-01-07'}, {目标:'aa',频道名称:'d',日期:'2019-01-02'}, {目标:'a',频道:'b',日期:'2019-01-02'}, {目标:'aaa',频道名称:'b',日期:'2019-01-01'}, {目标:'a',频道:'c',日期:'2019-01-08'}, {目标:'t',频道:'d',日期:'2019-01-04'}, {目标:'xxx',频道名称:'c',日期:'2019-01-03'}, {目标:'a',频道名称:'d',日期:'2019-01-01'}, ]; log`actualValue:${JSON.stringifyactualValue,null,2}`; expectactualValue.ToEqualSpectValue; };
这个单元测试通过了。希望有更好的方法。

如果性能有问题,您可能需要创建一个collator。请看我的回答:谢谢。但是单元测试没有通过。我改进了我的问题。@slideshow2我看到了。这只会使If稍微复杂一点,而不仅仅是从字符串比较返回,如果字符串相同,则必须更深一层,然后执行下一个If。