使用Lodash

时间:2018-10-03 09:10:10

标签: javascript arrays lodash

我从API调用中得到了一系列这样的JS对象:

[
    {
        "date": "2018-09-21T07:00:00",
        "assignments": 1
    },
    {
        "date": "2018-09-17T07:00:00",
        "assignments": 3
    },
    {
        "date": "2018-09-12T07:00:00",
        "assignments": 0
    }
]

如何使用Lodash将这个数组映射到以下对象集合?

{{
'2018-09-21': {selected: true},
'2018-09-17': {selected: true},
'2018-09-12': {selected: true}
}}

{marked:true}对象可以进行硬编码,并且日期格式必须如图所示。

谢谢!

2 个答案:

答案 0 :(得分:1)

普通JS实现

const myArr = [
    {
        "date": "2018-09-21T07:00:00",
        "assignments": 1
    },
    {
        "date": "2018-09-17T07:00:00",
        "assignments": 3
    },
    {
        "date": "2018-09-12T07:00:00",
        "assignments": 0
    }
];
 
const result = myArr.reduce((acc, currentValue) => {
  const formattedDate = currentValue.date.substr(0, 10);
  acc[formattedDate] = { selected: true };

  return acc;
}, {});

console.log(result);

Lodash实施

const myArr = [
    {
        "date": "2018-09-21T07:00:00",
        "assignments": 1
    },
    {
        "date": "2018-09-17T07:00:00",
        "assignments": 3
    },
    {
        "date": "2018-09-12T07:00:00",
        "assignments": 0
    }
];
 
const result = _.reduce(myArr, (acc, currentValue) => {
  const formattedDate = currentValue.date.substr(0, 10);
  acc[formattedDate] = { selected: true };

  return acc;
}, {});

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

答案 1 :(得分:0)

在这种情况下,如果您可以利用ES5并只使用reduce来减少一根衬板,则真的不需要耗费时间:

var data = [ { "date": "2018-09-21T07:00:00", "assignments": 1 }, { "date": "2018-09-17T07:00:00", "assignments": 3 }, { "date": "2018-09-12T07:00:00", "assignments": 0 } ]

const result = data.reduce((r, {date}) => 
   (r[date.substr(0, 10)] = { selected: true }) && r, {})

console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>

现在,如果由于浏览器限制等原因而不能使用ES6和箭头功能,那么lodash可以通过以下方式执行相同的操作:

_.reduce(data, function (r, c) { r[c.date.substr(0, 10)] = { selected: true }; return r }, {})