【问题标题】:Order objects in array based on values of two attributes根据两个属性的值对数组中的对象进行排序
【发布时间】:2018-03-14 22:01:36
【问题描述】:

我有一个包含 N 个对象的数组,每个对象都有以下字段:

{
  id: 'an id',
  description: 'a description',
  isUser: true/false
}

我需要根据两件事对该数组进行排序:

首先,如果描述包括“狗”、“猫”或“动物”,它应该在数组中的位置更早。 其次,如果isUser的值是false,它在数组中的位置也应该更早。

我注意到sort 函数在您想按不同属性的值进行优先级排序时没有帮助,所以我想知道在 Javascript(或 Lodash,我也在使用它)中执行此操作的最佳方法是什么:https://lodash.com/)

【问题讨论】:

  • 请添加一些数据用于排序和想要的顺序。
  • 更快的位置是什么意思?你想让具有isUser: falsedescription: 'dog'/'cat' or 'animal' 属性的对象出现在其他元素之前吗?

标签: javascript arrays sorting


【解决方案1】:

您可以检查想要的顶部字符串是否在描述中并将这些项目移动到顶部,以及 isUserfalse 值。

var array = [{ id: 1, description: 'cat', isUser: false }, { id: 5, description: 'dog', isUser: true }, { id: 6, description: 'flower', isUser: true }, { id: 7, description: 'cat', isUser: true }, { id: 2, description: 'animal', isUser: false }, { id: 3, description: 'tree', isUser: false }, { id: 4, description: 'dog', isUser: false }];
		
array.sort(function (a, b) {
    var top = ['dog', 'cat', 'animal'];
    return top.includes(b.description) - top.includes(a.description) || a.isUser - b.isUser;
});

console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 尼娜一个问题,为什么在包含的情况下你把B描述放在第一位,而在isUser时你把A放在第一位?那么,为什么不这样做:return top.includes(b.description) - top.includes(a.description) || b.isUser - a.isUser;?
【解决方案2】:

var test = [{
  id: 'an id',
  description: 'a description dog',
  isUser: false
},{
  id: 'an id 2',
  description: 'a description animal',
  isUser: true
},{
  id: 'an id 3',
  description: 'a description',
  isUser: true
},{
  id: 'an id 4',
  description: 'a description',
  isUser: false
}]

function sort(arr){
  return arr.sort(a=> !(a.description.includes('dog')||a.description.includes('cat')||a.description.includes('animal') || !a.isUser))
}

console.log(sort(test))

【讨论】:

    【解决方案3】:

    假设您的问题是根据给定的属性和条件重新排列现有数组。

    // grouping on basis of "description" 
    
    const animalGrp = _.groupBy(array, (t) => _.includes(t.description, 'dog') || _.includes(t.description, 'cat') || _.includes(t.description, 'animal') );
    
    // grouping on basis of "isUser" 
    const userGrp = _.groupBy(animalGrp.false, 'isUser');
    
    // final output
    const result = [...animalGrp.true, ...userGrp.true, ...userGrp.false]
    

    【讨论】:

      【解决方案4】:

      您可以将 compareFunction 传递给数组的排序方法,因此 sort 函数应该会有所帮助。示例:

      yourArray.sort( function(a, b) {
          if ( !a.isUser || a.description == 'animal')  return -1;
          return 1;
      });
      

      【讨论】:

        猜你喜欢
        • 2020-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-17
        • 1970-01-01
        • 2021-07-13
        • 2017-02-23
        • 1970-01-01
        相关资源
        最近更新 更多