我正在尝试按键名分组
let data = [
{ '0': '09/23/2019' },
{ '0': '23' },
{ '1': '09/10/2019' },
{ '1': '34' },
{ '2': '09/17/2019' },
{ '2': '45' } ]
所需的输出
data = [
{ date: 09/23/2019,
number: 23
},
{ date: 09/10/2019,
number: 34
}]
我尝试使用_.groupBy
,但是它仅接受两个参数collection和value。
我也尝试使用mapKeys
,但没有得到预期的输出。
let test = _.mapKeys(arrayData, function(value, key) {
return {
date: value[key],
number: value[key]
};
});
console.log(test)
这是我的repl
答案 0 :(得分:3)
您可以指定一个按给定顺序使用的键数组,并获取一个对象来跟踪该键的索引。
var data = [{ 0: '09/23/2019' }, { 0: '23' }, { 1: '09/10/2019' }, { 1: '34' }, { 2: '09/17/2019' }, { 2: '45' }],
keys = ['date', 'number'],
indices = {},
result = data.reduce((r, o) => {
var [k, v] = Object.entries(o)[0];
indices[k] = indices[k] || 0;
r[k] = r[k] || {};
r[k][keys[indices[k]++]] = v;
return r;
}, []);
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 1 :(得分:3)
看着您的副本,看起来您真的想转换以下对象:
const data = {
'true[0][the_date]': "09/23/2019",
'true[0][toothNumber]': "23",
'true[1][the_date]': "09/10/2019",
'true[1][toothNumber]': "34",
'true[2][the_date]': "09/17/2019",
'true[2][toothNumber]': "45",
};
对此:
[
{ date: '09/23/2019', number: '23' },
{ date: '09/10/2019', number: '34' },
{ date: '09/17/2019', number: '45' }
]
如果是这种情况,则可以简单地使用for循环:
const group = [];
for (let keys = Object.keys(data), i = 0; i < keys.length; i += 2)
group.push({
date: data[keys[i]],
number: data[keys[i + 1]],
});
就是这样,对于通常由数据库或类似服务生成的那些对象,您不需要任何特殊的实用程序,而且您删除了依赖项,并且运行速度比任何实用程序都要快。
这项工作也可以吗?还是您真的需要为此使用lodash?
答案 2 :(得分:2)
创建一个字典,将每个项目中的键作为索引,并使用简单的isNaN(+value)
标识数字和日期-该数字将返回NaN
的日期和有效数字的类型。
我用Array.prototype.reduce
和Object.values
来解决
let data = [
{ '0': '09/23/2019' },
{ '0': '23' },
{ '1': '09/10/2019' },
{ '1': '34' },
{ '2': '09/17/2019' },
{ '2': '45' } ];
const output = Object.values(data.reduce((out, val) => {
const [key, value] = Object.entries(val).pop();
out[key] = out[key] || {};
// this does the magic
out[key][isNaN(+value) ? 'date' : 'number'] = value;
return out;
}, {}));
console.log(output);
.as-console-wrapper { max-height: 100% !important; top: 0; }
.as-console { height: 100%;}