【问题标题】:AngularJS: use filter to split array into arraysAngularJS:使用过滤器将数组拆分为数组
【发布时间】:2016-05-19 11:57:42
【问题描述】:

我想将一个对象数组拆分为几个数组。 这些字符串在 AngularJS 中完美运行,并按照我想要的方式将整个数组 arr 拆分为四个数组:

    var arr0 = $filter('filter')(arr, { filterVal: 0 }, true);
    var arr1 = $filter('filter')(arr, { filterVal: 10 }, true);
    var arr2 = $filter('filter')(arr, { filterVal: 50 }, true);
    var arr3 = $filter('filter')(arr, { filterVal: 60 }, true);

其实上面总共四个数组就是原来的数组(因为每一项中的filterVal总是等于0, 10, 50 or 60)。

那么,问题是如何使上面的代码更短?所以,我需要在一行中将arr 拆分为 new_arr 以便

new_arr[0] is equal to arr0,
new_arr[1] is equal to arr1,
new_arr[2] is equal to arr2,
new_arr[3] is equal to arr3.

换句话说,我想使用一串代码(如果可能的话)而不是四串。 AngularJS 可以吗?

这样我会让它更有活力(而不是坚持四个)。

谢谢。

刚刚添加: 例如,

    arr = [
        {"code":"kfk", "flag":"dfmk", "filterVal": 0},
        {"code":"asg", "flag":"sdg3", "filterVal": 50},
        {"code":"asdf", "flag":"34t", "filterVal": 10},
        {"code":"hsdfh", "flag":"dfsg43", "filterVal": 50},
        ];

预计会被授予

var new_arr[0] = [{"code":"kfk", "flag":"dfmk", "filterVal": 0}];//0s
var new_arr[1]= [{"code":"asdf", "flag":"34t", "filterVal": 10},];//10s
var new_arr[2]= [{"code":"asg", "flag":"sdg3", "filterVal": 50},{"code":"hsdfh", "flag":"dfsg43", "filterVal": 50}];//50s
var new_arr[3]= [];//60s

【问题讨论】:

  • 请添加原始数组和想要的结果。
  • @NinaScholz 刚刚添加。谢谢。

标签: javascript arrays angularjs function filter


【解决方案1】:

您可以使用纯 Javascript 和数组进行分组。

var array = [{ "code": "kfk", "flag": "dfmk", "filterVal": 0 }, { "code": "asg", "flag": "sdg3", "filterVal": 50 }, { "code": "asdf", "flag": "34t", "filterVal": 10 }, { "code": "hsdfh", "flag": "dfsg43", "filterVal": 50 }, ],
    groups = [{ filterVal: 0 }, { filterVal: 10 }, { filterVal: 50 }, { filterVal: 60 }],
    result = groups.map(function (a) { return []; });

array.forEach(function (a) {
    groups.some(function (b, i) {
        var k = Object.keys(b)[0];
        return a[k] === b[k] && result[i].push(a);
    });
});

console.log(result);

或者你可以使用更线性的方法

var array = [{ "code": "kfk", "flag": "dfmk", "filterVal": 0 }, { "code": "asg", "flag": "sdg3", "filterVal": 50 }, { "code": "asdf", "flag": "34t", "filterVal": 10 }, { "code": "hsdfh", "flag": "dfsg43", "filterVal": 50 }, ],
    filter = [{ filterVal: 0 }, { filterVal: 10 }, { filterVal: 50 }, { filterVal: 60 }],
    groups = Object.create(null),
    result = filter.map(function (a) { return []; });

filter.forEach(function (b, i) {
    groups[b[Object.keys(b)[0]]] = i;
});
array.forEach(function (a) {
    result[groups[a.filterVal]].push(a);
});

console.log(result);

【讨论】:

  • 抱歉再次询问。看起来您的代码有效(非常感谢)。我的代码有效。问题是是否有可能使它更紧凑 - 一行而不是四行......无论如何,我赞成你的回答。再次感谢您。
  • 回答这个问题,不,不是。
【解决方案2】:

创建自定义过滤器:

app.filter('groupify', function(){
  return function(list, key) {
    return list.reduce((carry, row) => {
      if (!carry[row[key]]) carry[row[key]] = [];
      carry[row[key]].push(row);
      return carry;
    }, {});
  };
});

并使用它:

 var new_arr = $filter('groupify')(arr, 'filterVal');

你会得到一个对象:{0: [...], 10: [...], 50: [...], 60: [...]}
如有必要,很容易将其转换为数组。

【讨论】:

    【解决方案3】:

    这个呢?

    var new_arr = [0, 10, 50, 60].map(function (n) { 
        return $filter('filter')(arr, { filterVal: n }, true); 
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多