问题
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