如何高效地按键重建和分组数组
How to efficiently reconstruct and group an array by key
有谁知道最有效 loadash 或underscore.js 方法来按对象键对对象数组进行分组,然后根据分组?例如,我有一个汽车对象数组:
var cars = [
{
'make': 'audi',
'model: 'r8',
'year': '2012'
},
{
'make': 'audi',
'model: 'rs5',
'year': '2013'
},
{
'make': 'ford',
'model: 'mustang',
'year': '2012'
},
{
'make': 'ford',
'model: 'fusion',
'year': '2015'
},
{
'make': 'kia',
'model: 'optima',
'year': '2012'
},
];
我想创建一个新的汽车对象数组,这些对象按 keys
:
分组
var cars =
[{
"title": "make",
"data": [{
"value": "audi"
},
{
"value": "ford"
},
{
"value": "kia"
}
]
},
{
"title": "model",
"data": [{
"value": "r8"
},
{
"value": "rs5"
},
{
"value": "mustang"
},
{
"value": "fusion"
},
{
"value": "optima"
}
]
},
{
"title": "year",
"data": [{
"value": "2012"
},
{
"value": "2013"
},
{
"value": "2015"
}
]
}
]
提前致谢!
你需要这样的东西。
var cars =[
{
'make': 'audi',
'model': 'r8',
'year': '2012'
},
{
'make': 'audi',
'model': 'rs5',
'year': '2013'
},
{
'make': 'ford',
'model': 'mustang',
'year': '2012'
}
];
var result = _.map(cars, car => _. pairs(car))
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
然后,根据需要对数组进行分组。
可能不是很有效但可读且直接的方法(没有 lodash 也没有下划线):
var cars = [
{
'make': 'audi',
'model': 'r8',
'year': '2012'
},
{
'make': 'audi',
'model': 'rs5',
'year': '2013'
},
{
'make': 'ford',
'model': 'mustang',
'year': '2012'
},
{
'make': 'ford',
'model': 'fusion',
'year': '2015'
},
{
'make': 'kia',
'model': 'optima',
'year': '2012'
},
];
var res = [];
cars.forEach(car => {
var keys = Object.keys(car);
keys.forEach(key => {
var obj = res.find(o => o.title === key);
if (obj) {
if (!obj.data.some(it => it.value === car[key])) {
obj.data.push( { value: car[key]} );
}
} else {
res.push( {title: key, data: []} );
}
});
});
console.log(res);
不需要 lodash 或下划线。检查我做的这个实现。
function GroupArray(array) {
let result = {};
array.forEach(function(item) {
Object.keys(item).forEach(function(key) {
if (!result[key]) result[key] = [];
if (result[key].indexOf(item[key]) == -1) {
result[key].push(item[key]);
}
});
});
return result;
}
var cars = [
{
'make': 'audi',
'model': 'hello',
'year': '2012'
},
{
'make': 'audi',
'model': 'rs5',
'year': '2013'
},
{
'make': 'ford',
'model': 'mustang',
'year': '2012'
},
{
'make': 'ford',
'model': 'fusion',
'year': '2015'
},
{
'make': 'kia',
'model': 'optima',
'year': '2012'
},
];
console.log(GroupArray(cars));
有谁知道最有效 loadash 或underscore.js 方法来按对象键对对象数组进行分组,然后根据分组?例如,我有一个汽车对象数组:
var cars = [
{
'make': 'audi',
'model: 'r8',
'year': '2012'
},
{
'make': 'audi',
'model: 'rs5',
'year': '2013'
},
{
'make': 'ford',
'model: 'mustang',
'year': '2012'
},
{
'make': 'ford',
'model: 'fusion',
'year': '2015'
},
{
'make': 'kia',
'model: 'optima',
'year': '2012'
},
];
我想创建一个新的汽车对象数组,这些对象按 keys
:
var cars =
[{
"title": "make",
"data": [{
"value": "audi"
},
{
"value": "ford"
},
{
"value": "kia"
}
]
},
{
"title": "model",
"data": [{
"value": "r8"
},
{
"value": "rs5"
},
{
"value": "mustang"
},
{
"value": "fusion"
},
{
"value": "optima"
}
]
},
{
"title": "year",
"data": [{
"value": "2012"
},
{
"value": "2013"
},
{
"value": "2015"
}
]
}
]
提前致谢!
你需要这样的东西。
var cars =[
{
'make': 'audi',
'model': 'r8',
'year': '2012'
},
{
'make': 'audi',
'model': 'rs5',
'year': '2013'
},
{
'make': 'ford',
'model': 'mustang',
'year': '2012'
}
];
var result = _.map(cars, car => _. pairs(car))
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
然后,根据需要对数组进行分组。
可能不是很有效但可读且直接的方法(没有 lodash 也没有下划线):
var cars = [
{
'make': 'audi',
'model': 'r8',
'year': '2012'
},
{
'make': 'audi',
'model': 'rs5',
'year': '2013'
},
{
'make': 'ford',
'model': 'mustang',
'year': '2012'
},
{
'make': 'ford',
'model': 'fusion',
'year': '2015'
},
{
'make': 'kia',
'model': 'optima',
'year': '2012'
},
];
var res = [];
cars.forEach(car => {
var keys = Object.keys(car);
keys.forEach(key => {
var obj = res.find(o => o.title === key);
if (obj) {
if (!obj.data.some(it => it.value === car[key])) {
obj.data.push( { value: car[key]} );
}
} else {
res.push( {title: key, data: []} );
}
});
});
console.log(res);
不需要 lodash 或下划线。检查我做的这个实现。
function GroupArray(array) {
let result = {};
array.forEach(function(item) {
Object.keys(item).forEach(function(key) {
if (!result[key]) result[key] = [];
if (result[key].indexOf(item[key]) == -1) {
result[key].push(item[key]);
}
});
});
return result;
}
var cars = [
{
'make': 'audi',
'model': 'hello',
'year': '2012'
},
{
'make': 'audi',
'model': 'rs5',
'year': '2013'
},
{
'make': 'ford',
'model': 'mustang',
'year': '2012'
},
{
'make': 'ford',
'model': 'fusion',
'year': '2015'
},
{
'make': 'kia',
'model': 'optima',
'year': '2012'
},
];
console.log(GroupArray(cars));