按键分组,其中键是动态的

时间:2019-09-03 21:29:44

标签: javascript lodash

我正在尝试按键名分组

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

3 个答案:

答案 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.reduceObject.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%;}