Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/442.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/1/angularjs/23.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 Angular JS-按一个键排序,当另一个键为0时保留最终结果_Javascript_Angularjs - Fatal编程技术网

Javascript Angular JS-按一个键排序,当另一个键为0时保留最终结果

Javascript Angular JS-按一个键排序,当另一个键为0时保留最终结果,javascript,angularjs,Javascript,Angularjs,我有这样一个对象数组: $scope.cars = [ {"brand":"McLaren","price":70,"stock":0}, {"brand":"Renault","price":10,"stock":0}, {"brand":"Ferrari","price":100,"stock":3}, {"brand":"Lamborghini","price":50,"stock":2}, {"brand":"Porsche","price":30,"stock":1

我有这样一个对象数组:

$scope.cars = [
  {"brand":"McLaren","price":70,"stock":0},
  {"brand":"Renault","price":10,"stock":0},
  {"brand":"Ferrari","price":100,"stock":3},
  {"brand":"Lamborghini","price":50,"stock":2},
  {"brand":"Porsche","price":30,"stock":1},
  {"brand":"Seat","price":120,"stock":0},
  {"brand":"Audi","price":10,"stock":3},
];

在我看来,我想以从高到低的价格订购,但最后保留那些有
“库存”的:0
。有什么简单的方法可以做到这一点吗?下面是一个例子。谢谢

orderBy接受一个comparator函数,该函数获取两个对象的对
ng-repeat="car in cars | orderBy:'-price' | orderBy:'-stock'"
{值:“”,类型:,索引:}
并应返回

您可以实现一个自定义比较器来比较股票元素,只考虑0和>=1,并按价格和最终指数排序

var-app=angular.module('myApp',[]);
应用程序控制器('myCtrl',函数($scope){
$scope.title=“汽车”;
$scope.cars=[{“品牌”:“迈凯轮”,“价格”:70,“股票”:0},
{“品牌”:“雷诺”,“价格”:10,“股票”:0},
{“品牌”:“法拉利”,“价格”:100,“股票”:3},
{“品牌”:“兰博基尼”,“价格”:50,“股票”:2},
{“品牌”:“保时捷”,“价格”:30,“库存”:1},
{“品牌”:“座位”,“价格”:120,“股票”:0},
{“品牌”:“奥迪”,“价格”:10,“库存”:3},
];
$scope.carComparator=函数(v1、v2){
var car1=v1.0值
var car2=v2.0值
//没有库存的汽车总是比有库存的汽车“少”
var stock1=car1&&car1.stock>0
var stock2=car2&&car2.stock>0
如果(库存1!=库存2){
返回库存2-库存1;
}
//如果库存没有决定,我们就按价格排序。

//如果2更昂贵,我们返回一个大于0的数字,因此它的排序值大于1,如果2更便宜,结果是前面的比较器函数,我们可以按“stock==0”排序,因为按字符串排序是角度表达式。这比我最初的比较器解决方案简单得多

`orderBy:['stock==0','-price']`

lip{
字体系列:Arial;
颜色:黑色;
}
.鼻塞{
字体系列:Arial;
颜色:灰色;
字体:斜体;
}

{{title}}

  • {{car.brand}({{car.price}})缺货

var-app=angular.module('myApp',[]); 应用程序控制器('myCtrl',函数($scope){ $scope.title=“汽车”; $scope.cars=[ {“品牌”:“迈凯轮”,“价格”:70,“股票”:0}, {“品牌”:“雷诺”,“价格”:10,“股票”:0}, {“品牌”:“法拉利”,“价格”:100,“股票”:3}, {“品牌”:“兰博基尼”,“价格”:50,“股票”:2}, {“品牌”:“保时捷”,“价格”:30,“库存”:1}, {“品牌”:“座位”,“价格”:120,“股票”:0}, {“品牌”:“奥迪”,“价格”:10,“库存”:3}, ]; });
@Joe82我添加了一个实现,实际的排序顺序是由返回的a-b行决定的。如果你交换它们,它会将该标准倒转为答案!难道不可能将比较器作为orderBy数组中的第一个标准来实现,然后作为第二个标准来定价吗?我想是这样的,我没有尝试过,但是lso完全放弃了比较器的想法,因为排序字符串是表达式。-price字面上是按负价格排序的,所以您应该能够按“stock not 0,-price”排序是的,您是对的,
ng repeat=“car in cars | orderBy:['stock==0','-price']”
成功了。谢谢!@Joe82很好的回答。我应该试着让它与表达式一起工作:
orderBy:['stock==0','-price']
…我想只有当条件变得更复杂时才需要自定义比较器。不鼓励只使用代码的答案。你能解释一下你的答案吗?