按angularJS中的动态属性排序
Sorting by dynamic properties in angularJS
我正试图在angular中创建一个电子表格。
我已经完成了大部分基本功能,但我只是找不到使用当前数据结构按单列排序的方法。
这是Plnkr
你认为我应该改变数据结构,为不同的列提供一个单独的数组吗?或者它可以与这个数组一起使用吗?
目前,它只是在单元格中的值发生更改时为作用域对象生成动态属性。
这是用于生成和计算单元格值的代码。
process = function (exp) {
return exp.replace(/[A-Z]'d+/g, function (ref) {
return 'result("' + ref + '")';
})
}
$scope.result = function (cell) {
if ($scope.cells[cell]) {
if (stringStartsWith($scope.cells[cell], "=")) {
var val = $scope.cells[cell].substring(1);
return $parse(process(val))($scope);
}
else {
return $scope.cells[cell];
}
}
else {
return $scope.cells[cell];
}
};
您可以在这里找到阵列(多)分拣机实用程序(根据需要使用)
源代码:
// Array multi - sorter utility
// returns a sorter that can (sub-)sort by multiple (nested) fields
// each ascending or descending independantly
// https://github.com/foo123/sinful.js
[Array, 'sorter', function () {
var arr = this, i, args = arguments, l = args.length,
a, b, avar, bvar, variables, step, lt, gt,
field, filter_args, sorter_args, desc, dir, sorter,
ASC = '|^', DESC = '|v';
// |^ after a (nested) field indicates ascending sorting (default),
// example "a.b.c|^"
// |v after a (nested) field indicates descending sorting,
// example "b.c.d|v"
if ( l )
{
step = 1;
sorter = [];
variables = [];
sorter_args = [];
filter_args = [];
for (i=l-1; i>=0; i--)
{
field = args[i];
// if is array, it contains a filter function as well
filter_args.unshift('f'+i);
if ( field.push )
{
sorter_args.unshift(field[1]);
field = field[0];
}
else
{
sorter_args.unshift(null);
}
dir = field.slice(-2);
if ( DESC === dir )
{
desc = true;
field = field.slice(0,-2);
}
else if ( ASC === dir )
{
desc = false;
field = field.slice(0,-2);
}
else
{
// default ASC
desc = false;
}
field = field.length ? '["' + field.split('.').join('"]["') + '"]' : '';
a = "a"+field; b = "b"+field;
if ( sorter_args[0] )
{
a = filter_args[0] + '(' + a + ')';
b = filter_args[0] + '(' + b + ')';
}
avar = 'a_'+i; bvar = 'b_'+i;
variables.unshift(''+avar+'='+a+','+bvar+'='+b+'');
lt = desc ?(''+step):('-'+step); gt = desc ?('-'+step):(''+step);
sorter.unshift("("+avar+" < "+bvar+" ? "+lt+" : ("+avar+" > "+bvar+" ? "+gt+" : 0))");
step <<= 1;
}
// use optional custom filters as well
return (new Function(
filter_args.join(','),
['return function(a,b) {',
' var '+variables.join(',')+';',
' return '+sorter.join('+')+';',
'};'].join("'n")
))
.apply(null, sorter_args);
}
else
{
a = "a"; b = "b"; lt = '-1'; gt = '1';
sorter = ""+a+" < "+b+" ? "+lt+" : ("+a+" > "+b+" ? "+gt+" : 0)";
return new Function("a,b", 'return '+sorter+';');
}
}],
测试示例:
var arr = [
{f1: 1, f2: {f3: 3} },
{f1: 1, f2: {f3: -4} },
{f1: -1, f2: {f3: 2} }
];
// field f1 asc, field f2.f3 desc
var multiSorter = Array.sorter('f1|^','f2.f3|v');
// field f1 asc, field f2.f3 desc using custom filter
var multiSorterFilter = Array.sorter('f1|^',['f2.f3|v', function(f){return -f;}]);
require('assert').deepEqual(arr.sort(multiSorter), [{f1: -1, f2: {f3: 2} },{f1: 1, f2: {f3: 3} },{f1: 1, f2: {f3: -4}}]);
require('assert').deepEqual(arr.sort(multiSorterFilter), [{f1: -1, f2: {f3: 2} },{f1: 1, f2: {f3: -4} },{f1: 1, f2: {f3: 3}}]);
相关文章:
- jQuery TinySort按数据属性排序和放置
- AngularJS使用对象属性排序多个对象数组
- JavaScript 中的对象属性排序
- 类型错误: 无法读取未定义的属性“排序级别”
- 按属性排序的 Javascript 对象数组不起作用
- 更改按自定义属性排序的对象数组的顺序
- JS mongoDB按previousItem属性排序(父子关系)
- 按ember.js对象控制器中的属性排序
- 按angularJS中的动态属性排序
- 在按导航属性排序时,breezejs:inlineCount不正确
- 按对象属性排序javascript数组
- 如何使用比较器按多个属性排序
- 基于任意长度的属性排序JavaScript对象数组
- 使用javascript按不同属性排序
- Jquery:按内部元素's属性排序
- 在Immutable.js的Map中,按子对象的属性排序的正确方法是什么?
- 基于日期属性排序javascript对象
- 使用NodeJS通过属性排序嵌套JSON
- 按类属性排序对象的树结构
- 使用jQuery UI Sortable交换数据属性排序