2017-02-24 76 views
1

因为我应该知道如何弄清楚这个问题,所以我觉得很尴尬,但是我正在旋转我的轮子,通过多个键组合一个对象数组。通过多个键分组对象排列对象

这里的数据:

[ 
     { 
     "car": "audi", 
     "type": "A6", 
     "style": "Avant", 
     "year": "1996" 
     }, 
     { 

     "car": "audi", 
     "type": "A4", 
     "style": "2", 
     "year": "2006" 
     }, 
     { 

     "car": "audi", 
     "type": "A4", 
     "style": "L W12", 
     "year": "2006" 
     }, 
     { 

     "car": "audi", 
     "type": "80", 
     "style": "GLE", 
     "year": "1975" 
     }, 
     { 

     "car": "audi", 
     "type": "A6", 
     "style": "Avant L", 
     "year": "1996" 
     }, 
     { 
     "car": "audi", 
     "type": "A6", 
     "style": "3.2 Multitronic", 
     "year": "2006" 
     }, 
] 

我一直在努力,但收效甚微,产生如下:

[{ 
    "audi": [{ 
    "1996": { 
     "A6": ["Avant, Avant L"] 
    } 
    }, { 
    "2006": } 
     "A6": ["3.2 Multitronic"], 
     "A4": ["L W12", "2"] 
    } 
    } 
    .... 
}] 

的模式是:

{ 
    "car1": [{ 
     "year1": { 
      "style1": ["trim1", "trim2"], 
      "style2": ["trim1", "trim2"] 
     }, 
     "year1": { 
      "style1": ["trim1", "trim2"], 
      "style2": ["trim1", "trim2"] 
     } 
    }], 
    "car2": [{ 
     "year1": { 
      "style1": ["trim1", "trim2"], 
      "style2": ["trim1", "trim2"] 
     }, 
     "year2": { 
      "style1": ["trim1", "trim2"], 
      "style2": ["trim1", "trim2"] 
     } 
    }] 
} 

我我已经尝试了以下方法lodash

let result = _.chain(carData) 
    .groupBy('car') 
    .toPairs() 
    .map(function(curr) { 
     return _.zipObject(['car', 'year'], curr); 
    }) 
    .value(); 

This gets me part of the way,但是当涉及汽车每年的样式和类型时,我最终得到的数据不完整。

+3

请添加您的尝试。 –

+0

已更新,但我试图在此情况下不使用lodash – hybrid9

回答

1

您可以对给定的属性使用散列对象和嵌套方法。

var data = [{ car: "audi", type: "A6", style: "Avant", year: 1996 }, { car: "audi", type: "A4", style: 2, year: 2006 }, { car: "audi", type: "A4", style: "L W12", year: 2006 }, { car: "audi", type: 80, style: "GLE", year: 1975 }, { car: "audi", type: "A6", style: "Avant L", year: 1996 }, { car: "audi", type: "A6", style: "3.2 Multitronic", year: 2006 }], 
 
    keys = ['car', 'year', 'type'], 
 
    result = []; 
 

 
data.forEach(function (a) { 
 
    keys.reduce(function (r, k) { 
 
     var o = {}; 
 
     if (!r[a[k]]) { 
 
      r[a[k]] = { _: [] }; 
 
      o[a[k]] = r[a[k]]._; 
 
      r._.push(o); 
 
     } 
 
     return r[a[k]]; 
 
    }, this)._.push(a.style); 
 
}, { _: result }); 
 
    
 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

我的思想被吹拂。你介意一下你的代码吗?我特别好奇将{_:result}作为reduce()的初始值传入。 – hybrid9

+0

实际上这种方法基本上与[将json对象数组转换为另一个json对象](http://stackoverflow.com/a/42401985/1447675)类似,只是这些键更容易访问,结果是更容易创建而不用回调。对于散列表,您可以了解这些方法和分组功能。 –

1

下面是一个(略详细)解决方案,可产生正是你想要的JSON对象形状和组通过无限键:

var cars = [{ 
 
    "car": "audi", 
 
    "type": "A6", 
 
    "style": "Avant", 
 
    "year": "1996" 
 
}, { 
 

 
    "car": "audi", 
 
    "type": "A4", 
 
    "style": "2", 
 
    "year": "2006" 
 
}, { 
 

 
    "car": "audi", 
 
    "type": "A4", 
 
    "style": "L W12", 
 
    "year": "2006" 
 
}, { 
 

 
    "car": "audi", 
 
    "type": "80", 
 
    "style": "GLE", 
 
    "year": "1975" 
 
}, { 
 

 
    "car": "audi", 
 
    "type": "A6", 
 
    "style": "Avant L", 
 
    "year": "1996" 
 
}, { 
 
    "car": "audi", 
 
    "type": "A6", 
 
    "style": "3.2 Multitronic", 
 
    "year": "2006" 
 
}, ]; 
 

 
function groupBy(list, prop) { 
 
    return list.reduce((groupped, item) => { 
 
    var key = item[prop]; 
 
    delete item[prop]; 
 
    if (groupped.hasOwnProperty(key)) { 
 
     groupped[key].push(item); 
 
    } else { 
 
     groupped[key] = [item]; 
 
    } 
 
    return groupped 
 
    }, {}); 
 
} 
 

 
function groupSubKeys(obj, properties, propIndex) { 
 
    var grouppedObj = groupBy(obj, properties[propIndex]); 
 
    Object.keys(grouppedObj).forEach((key) => { 
 
    if (propIndex < properties.length - 2) { 
 
     grouppedObj[key] = groupSubKeys(grouppedObj[key], properties, propIndex + 1); 
 
    } else { 
 
     grouppedObj[key] = grouppedObj[key].map(item => item[properties[propIndex + 1]]) 
 
    } 
 
    }); 
 
    return grouppedObj; 
 
} 
 

 
function groupByProperties(list, properties) { 
 
    return groupSubKeys(list, properties, 0); 
 
} 
 

 
console.log(groupByProperties(cars, ['car', 'year', 'type', 'style']));

这里有一个运行示例: http://codepen.io/rarmatei/pen/evmBOo

+0

这个看起来不错。我无法将我的脑袋缠绕在由subKeys组成的团队中,并最终得到空阵列。我很欣赏你提供的这个时间。 – hybrid9