Javascript 使用两个属性排序

Javascript sorting with two properties

我正在努力对两个级别进行排序。逻辑如下。如果任何对象具有状态,则 return 具有状态的最新对象。如果 none 个对象有状态,return 个没有状态的最新对象。

var apps = [
  { status: 'PASS', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT)
  },
  { status: 'FAIL',
    date_created: Thu Sep 02 2015 17:24:45 GMT-0700 (PDT),
  },
  { status: '',
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT),
  }
]

var desired_result = [{ status: 'PASS', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT)
  }]

var apps_2 = [
  { status: '', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT)
  },
  { status: '',
    date_created: Thu Sep 02 2015 17:24:45 GMT-0700 (PDT),
  },
  { status: '',
    date_created: Thu Sep 01 2015 17:24:45 GMT-0700 (PDT),
  }
]

var desired_resul2 = [{ status: '', 
    date_created: Thu Sep 03 2015 17:24:45 GMT-0700 (PDT)
  }]

我试过了

var sorted = _.sort_by(apps, function (x) { x.date_updated });

我也查看了其他一些 SO questions,但在第一次排序后无法将对象保持在原位。

如果我没有正确理解你的问题,这就是你要查找的内容。 http://jsfiddle.net/whxu5sea/3/

您需要过滤元素以确保它们具有任何类型的状态。然后按日期排序,最早的在前。然后得到第一个值。在我的示例中,我假设了字符串所在的日期,但仍然应该有效。

var apps = [
  { status: 'PASS', 
    date_created: 'Thu Sep 03 2015 17:24:45 GMT-0700 (PDT)'
  },
  { status: 'FAIL',
    date_created: 'Thu Sep 02 2015 17:24:45 GMT-0700 (PDT)',
  },
  { status: '',
    date_created: 'Thu Sep 01 2015 17:24:45 GMT-0700 (PDT)',
  }
];

var x;
var arr = _.filter(apps, function(data) {
    return !!data.status.length;
});

x = _.chain( arr.length ? arr : apps )
    .sortBy(function(data) {
        return new Date(data.date_created).getTime();
    }).last().value();

console.log( x );

在未提供状态时检查它是否有效:http://jsfiddle.net/whxu5sea/4/

希望对您有所帮助。 LMK 如果需要进一步说明。

编辑:更新以获取最新元素(最后一个)。

这是一个简单的解决方案,它只通过 apps 迭代一次,没有过滤步骤。 See here for a jsfiddle.

这个概念是,如果status是假的,它的日期被转换成一个负数,保留所有假元素之间的正确排序顺序,但使所有假元素的排序顺序低于所有非虚假的。

我们通过减去 8640000000000001 来转换虚假元素日期,即(the maximimum millis in a Date,加一)。

var x = _.chain(apps).sortBy(function(x) {
      var date = new Date(x.date_created).getTime();
      return x.status ? date : date - 8640000000000001;
    }).last().value();

console.log( x );