给定一个对象数组,创建一个函数,该函数返回一个 Object,该 Object 具有按类型分组的路径数组

Given an array of objects, create a function that returns an Object that has an array of paths grouped by type

本文关键字:一个 Object 函数 数组 类型 路径 创建 一个对象 返回      更新时间:2023-09-26

我有一个对象数组,如下所示:

var data = [
  {name : 'xxxx' , type: 'jpeg' , path: '../'},
  {name : 'yyyy' , type: 'gif' , path: '../'},
  {name : 'zzzz' , type: 'jpeg' , path: '../'}
];   

我希望结果采用以下格式:

{
  jpeg: ['../xxxx.jpeg', '../zzzz.jpeg'],
  gif:['../yyyy.gif']
}

我的尝试:

function transformData(data) {
    var result = {};
    if (data && data.length > 0) {
        for (var i = 0; i < data.length; i++) {
            result[data[i].type] = [data[i].path + data[i].name];
        }
    }
    console.log(result);
}
transformData(data);

由于有几个答案,我将根据reduce给出一个功能:

var arr = data.reduce(function(r,m){
  (r[m.type]||(r[m.type]=[])).push(m.path+m.name+'.'+m.type);
  return r;
},{});

您可以使用 Array.prototype.reduce() 函数来获得优雅的解决方案。

// Your data
var data = [
  {name : 'xxxx' , type: 'jpeg' , path: '../'},
  {name : 'yyyy' , type: 'gif' , path: '../'},
  {name : 'zzzz' , type: 'jpeg' , path: '../'}
];
// Solution
var res = data.reduce(function(prev, current) {
    ((prev[current.type])||(prev[current.type] = [])).push( current.path + current.name + '.' + current.type );
    return prev;
}, {});
// console.log( res );

试试这个

var data = [
  {name : 'xxxx' , type: 'jpeg' , path: '../'},
  {name : 'yyyy' , type: 'gif' , path: '../'},
  {name : 'zzzz' , type: 'jpeg' , path: '../'}
];   
var res = {},
    len = data.length, i;

for (i = 0; i < len; i++) {
  if (!res[data[i].type]) {
    res[data[i].type] = [];
  }
  res[data[i].type].push(data[i].path + data[i].name + '.' + data[i].type);
}

您可以使用

forEach执行此操作:

var data = [
  {name : 'xxxx' , type: 'jpeg' , path: '../'},
  {name : 'yyyy' , type: 'gif' , path: '../'},
  {name : 'zzzz' , type: 'jpeg' , path: '../'}
];
var result = {};
data.forEach(function(elem){
    result[elem.type] = result[elem.type] || [];
    result[elem.type].push(elem.path + elem.name + '.' + elem.type);
});

请记住,Array.prototype.forEach()不能在 IE8 或更低版本中使用,但 mdn 页面有一些填充物。