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

时间:2015-01-21 09:35:30

标签: javascript

我有一个对象数组如下:

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);

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

试试这个

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);
}

Example

答案 2 :(得分:0)

您可以使用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 );

答案 3 :(得分:-1)

您可以使用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页面有一些polyfill。