我有一个像这样的数组:
var array = [{value: 1, text:"one"},{value: 2, text:"two"},{value: 3, text:"three"}]
,我想根据以下变量对其进行排序:var order = '1,3,2';
意思是,它将按照1,3,2
的顺序排列,该顺序由数组中对象的value
属性进行排序。
我在AngularJS ng-repeat
数组中使用它,但是我无法在orderBy
上使用自定义比较,因为我使用的是1.2.14版,它在{{3}中发布}。我无法更改版本。
我曾想过从AngularJS中提取逻辑并只对1.5.7中的数组进行排序,但是由于它是基于数组中的值而不是从另一个值中进行排序,所以陷入了困境。
例如,我尝试使用自定义排序进行尝试,但是我只想一次比较一个索引。我不想遍历每对事物进行排序。我只想从函数中使用a
,而不要同时使用a
和b
。
(function() {
var app = angular.module('test', []);
app.controller("test", function($scope) {
$scope.selectedOption = {};
$scope.availableOptions = [{
value: 1,
text: "one"
}, {
value: 2,
text: "two"
}, {
value: 3,
text: "three"
}];
$scope.availableOptions.sort(sortOptions);
});
var sortOptions = function(a, b) {
var sortBy = '1,3,2';
var values = sortBy.split(',');
for (val in values) {
v = parseInt(val);
if (v === a.value) {
return 0;
} else if (v < a.value) {
return -1;
} else if (v > a.value) {
return 1;
}
}
};
})();
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.2.14/angular.min.js"></script>
<div ng-app="test" ng-controller="test">
<select ng-model="selectedOption.value">
<option ng-repeat="option in availableOptions" value="{{option.value}}">{{option.text}}</option>
</select>
</div>
我希望下拉列表中的One, Three, Two
从上到下依次排列。有没有一种方法只能一次将.sort
与数组中的一个值一起使用?而且只能比较一次?
答案 0 :(得分:3)
您可以在value
中查找order
的索引。如果order
是array
会更容易,但是如果必须是字符串,则仍可以在字符串中查找索引。
let array = [{value: 1, text: "one"}, {value: 2, text: "two"}, {value: 3, text: "three"}];
let order = [1, 3, 2]; // '1,2,3' will also work
let sorted = array.sort((a, b) => order.indexOf(a.value) - order.indexOf(b.value));
console.log(sorted);
答案 1 :(得分:3)
您可以将Map
用于所需的排序顺序,但是由于需要获得相对顺序,因此需要两个参数进行排序。
var array = [{ value: 1, text: "one" }, { value: 2, text: "two" }, { value: 3, text: "three" }],
orderStr = '1,3,2',
order = new Map(orderStr.split(',').map((k, v) => [+k, v]));
array.sort((a, b) => order.get(a.value) - order.get(b.value));
console.log(array);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:1)
为什么不添加另一个属性(如SortOrder)并按需要查看的顺序从0 ... N为其分配数字(将1,3,2编译为0,1,2) 而不使用该字段作为orderBy字段,而无需任何特殊的自定义逻辑?