从去掉日期创建新数组

时间:2017-03-22 20:06:38

标签: javascript arrays

我正在努力收集来自多个阵列的信息,但我遇到了绊脚石。我需要能够确定每个城市花了多少天。问题是我无法想出一种方法来计算一天中的时间条目为1天。在下面的前两个圣地亚哥条目应该导致一天,因为两个日志都发生在同一天。

timeLogs = [
    {'city':'San Diego','date':'2017-03-21T18:52:00.984Z'},
    {'city':'San Diego','date':'2017-03-21T12:13:00.984Z'},
    {'city':'San Diego','date':'2017-03-19T11:02:00.984Z'},
    {'city':'Boulder','date':'2017-02-12T11:29:00.984Z'}
]

我所追求的是基于以上结果的以下结果数组:

daysPerCity = [
    {'San Diego':'2'},
    {'Boulder':'1'}
]

目前我正在开发一个循环,它将日期转换为字符串,然后检查是否相等,如果相同我试图不在新数组中增加城市但是当它碰到第一个时我就卡住了一个城市的例子...

2 个答案:

答案 0 :(得分:-1)

您可以使用reducemap等数组方法构建包含按城市分组的唯一日期的对象,然后使用Object.keys(...).length获取不同日期的数量。



var timeLogs = [
    { city: 'San Diego', date: '2017-03-21T18:52:00.984Z' },
    { city: 'San Diego', date: '2017-03-21T12:13:00.984Z' },
    { city: 'San Diego', date: '2017-03-19T11:02:00.984Z' },
    { city: 'Boulder', date: '2017-02-12T11:29:00.984Z' }
]

var daysPerCity = timeLogs.reduce(function (map, e) {
  (map[e.city] = map[e.city] || {})[e.date.slice(0, 10)] = true
  return map
}, {})

Object.keys(daysPerCity).forEach(function (k) {
  this[k] = Object.keys(this[k]).length
}, daysPerCity)

console.log(daysPerCity)




答案 1 :(得分:-1)

您可以使用此ES6代码:

const timeLogs = [
    {'city':'San Diego','date':'2017-03-21T18:52:00.984Z'},
    {'city':'San Diego','date':'2017-03-21T12:13:00.984Z'},
    {'city':'San Diego','date':'2017-03-19T11:02:00.984Z'},
    {'city':'Boulder','date':'2017-02-12T11:29:00.984Z'}
];

const result = Object.assign({}, ...Array.from(
    timeLogs.reduce( (acc, {city, date}) => {
        (acc.get(city) || acc.set(city, new Set).get(city))
            .add(date.substr(0, 10));
        return acc;
    }, new Map),
    ([city, days]) => ({ [city]: days.size })
));

console.log(result);