Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/436.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 如何根据字段的值和对象的重新映射过滤对象数组?_Javascript_Lodash - Fatal编程技术网

Javascript 如何根据字段的值和对象的重新映射过滤对象数组?

Javascript 如何根据字段的值和对象的重新映射过滤对象数组?,javascript,lodash,Javascript,Lodash,我的目标如下: options.getOrderBy = function (type) { var OrderBy = [ { type: 'x', id: 0, label: 'xx1', key: 'yy1' }, { type: 'x', id: 1, label: 'xx2', key: [1,2] }, { type: 'x', id: 9, label: 'xx2', key: ['a','b'] }, { t

我的目标如下:

options.getOrderBy = function (type) {
    var OrderBy = [
        { type: 'x', id: 0, label: 'xx1', key: 'yy1' },
        { type: 'x', id: 1, label: 'xx2', key: [1,2] },
        { type: 'x', id: 9, label: 'xx2', key: ['a','b'] },
        { type: 'y', id: 0, label: 'xx44', key: 'yya' },
        { type: 'y', id: 1, label: 'xx45', key: 'yyb' },
        { type: 'y', id: 2, label: 'xx46', key: 'yyc' },
    ];
    return OrderBy;
};
我需要的是,当使用('x')类型调用函数时,我希望它返回如下内容:

[
   { id: 0, label: 'xx1', key: [1.2] },
   { id: 1, label: 'xx2', key: 'yy2' },
   { id: 9, label: 'xx2', key: ['a','b'] }
]
有人能告诉我如何根据type字段的值过滤数组,然后返回一个包含id、label和key的对象数组吗


请注意,我有lodash,如果它更简单的话,我想使用它。另外,我的解决方案是针对IE9以上的浏览器,您可以像这样过滤订单选项:

var newOrderBy = [];
for(var i = 0, l = OrderBy.length; i < l; i++) {
  if(OrderBy[i].type == type) {
    newOrderBy.push({
      id: OrderBy[i].id,
      label: OrderBy[i].label,
      key: OrderBy[i].key
    });
  }
}
var newOrderBy=[];
for(var i=0,l=OrderBy.length;i
如果您可以将OrderBy结构更改为对象,则会简单得多:

options.getOrderBy = function (type) {
    var OrderBy = {
      x:[ 
          { id: 0, label: 'xx1', key: 'yy1' },
          {  id: 1, label: 'xx2', key: 'yy2' }
        ],
      y:[
          { id: 0, label: 'xx44', key: 'yya' },
          { id: 1, label: 'xx45', key: 'yyb' },
          { id: 2, label: 'xx46', key: 'yyc' }
        ]
    };
    return OrderBy[type];
};

使用下划线.js wu.filter():-


})

我的解决方案利用Lodash的
映射
省略
功能。看到了吗

将其用作:

var filtered = filter(OrderBy, 'type');
var filtered = filter(OrderBy, 'type', 'x');
var filtered = filterV2(OrderBy, { key: 'type', value: 'x' });
编辑:同时考虑过滤键的值

var filter = function(collection, filterKey, filterValue) {
                 return _.compact(_.map(collection, function(elem) {
                     if(elem[filterKey] === filterValue)
                         return _.omit(elem, filterKey);
                 }))        
              }
将其用作:

var filtered = filter(OrderBy, 'type');
var filtered = filter(OrderBy, 'type', 'x');
var filtered = filterV2(OrderBy, { key: 'type', value: 'x' });
第二次编辑:更清晰的版本

var filterV2 = function(collection, filter) {
    return _(collection)
           .map(function (elem) { if(elem[filter.key] == filter.value) return _.omit(elem, filter.key) })
           .compact()
           .value()
} 
将其用作:

var filtered = filter(OrderBy, 'type');
var filtered = filter(OrderBy, 'type', 'x');
var filtered = filterV2(OrderBy, { key: 'type', value: 'x' });

你的第二个建议似乎不错。但是如果我的类型是abc呢。我注意到在x和y周围没有任何引号。如何检查以仅返回其
element.type==type
的元素?这看起来不像是回答OP问题,只是其中的一部分!你说得对,我完全错过了那部分。我会尽快更正它。我更正了答案并提供了两个工作实现。