Reducing Javascript array into a map and removing duplicate values

醉酒当歌 提交于 2019-12-25 18:17:29

问题


I am sure there is a clean way to do this, but I have no idea how to do it. I want to pluck a column out such that I am only returning the first occurrence of a value, but I want to keep the key that went with it.

I have a dataset that I want reduced. I want to pluck out the 'precip'.

Say I have this:

[
  "2019-01-01" => {"temp" : "cold", "season" : "winter", "precip" : "snow"},
  "2019-02-01" => {"temp" : "cold", "season" : "winter", "precip" : "none"},
  "2019-03-01" => {"temp" : "mild", "season" : "spring", "precip" : "rain"},
  "2019-04-01" => {"temp" : "mild", "season" : "spring", "precip" : "none"},
  "2019-05-01" => {"temp" : "warm", "season" : "spring", "precip" : "rain"},
  "2019-06-01" => {"temp" : "warm", "season" : "summer", "precip" : "hail"},
  "2019-07-01" => {"temp" : "hot", "season" : "summer", "precip" : "none"}
]

I would like to end up with this:

[
  "2019-01-01" => "snow",
  "2019-02-01" => "none",
  "2019-03-01" => "rain",
  "2019-06-01" => "hail"
]

I would think that Array.map has something to do with this, but I don't know how to return the key/value pair instead of just a value (i.e. map(function(d) { return d.precip }) )

What is the smooth way to do this?

Thanks in advance.


回答1:


You could create a Map and take only the first item with the same key.

function getFirstPrecip(data) {
    return Object.assign({}, ...Array.from(
        data.reduce((m, o) => {
            var [[k, { precip }]] = Object.entries(o);
            return m.has(precip) ? m : m.set(precip, k);
        }, new Map),
        ([k, v]) => ({ [v]: k })
    ));
}

var data = [{ "2019-01-01": { temp: "cold", season: "winter", precip: "snow" } }, { "2019-02-01": { temp: "cold", season: "winter", precip: "none" } }, { "2019-03-01": { temp: "mild", season: "spring", precip: "rain" } }, { "2019-04-01": { temp: "mild", season: "spring", precip: "none" } }, { "2019-05-01": { temp: "warm", season: "spring", precip: "rain" } }, { "2019-06-01": { temp: "warm", season: "summer", precip: "hail" } }, { "2019-07-01": { temp: "hot", season: "summer", precip: "none" } }];

console.log(getFirstPrecip(data));



回答2:


You can iterate the keys for the main object, and create a new object that will use those keys and assign the precip attribute value as value for the new key=>value pair:

var dates = {
  "2019-01-01" : {"temp" : "cold", "season" : "winter", "precip" : "snow"},
  "2019-02-01" : {"temp" : "cold", "season" : "winter", "precip" : "none"},
  "2019-03-01" : {"temp" : "mild", "season" : "spring", "precip" : "rain"},
  "2019-04-01" : {"temp" : "mild", "season" : "spring", "precip" : "none"},
  "2019-05-01" : {"temp" : "warm", "season" : "spring", "precip" : "rain"},
  "2019-06-01" : {"temp" : "warm", "season" : "summer", "precip" : "hail"},
  "2019-07-01" : {"temp" : "hot", "season" : "summer", "precip" : "none"}
};
var result = Object.keys(dates).reduce((k,d) => {return [...k, {[d]:dates[d].precip}]}, [])
console.log(result)


来源:https://stackoverflow.com/questions/57277330/reducing-javascript-array-into-a-map-and-removing-duplicate-values

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!