我试图弄清楚如何将值分组。例如,我想转换下面的数据
[
{"book": "Typescript 1", "year": "2015", "units": 1000},
{"book": "Javascript 1", "year": "2015", "units": 2000},
{"book": "Typescript1", "year": "2016", "units": 6000}
]
在
[
{
"book": "Typescript 1",
"series": [
{"year": "2015", "units": 1000},
{"year": "2016", "units": 6000}
]
},
{
"book": "Javascript 1",
"series": [
{"year": "2015", "units": 2000}
]
}
]
请阅读"Why using _.chain
is a mistake."以及为什么建议使用flow()
。
以下是从函数式编程角度解决问题的几个方法:
import tap from "lodash/fp/tap";
import flow from "lodash/fp/flow";
import groupBy from "lodash/fp/groupBy";
const map = require('lodash/fp/map').convert({ 'cap': false });
const result = flow(
groupBy('book'),
map((series, book) => ({book, series: series.map(({units, year}) =>
({year, units}) )})),
tap(console.log)
)(input)
其中input
是您要转换的数组。
这是使用reduce()
和Object.values()
使用纯JavaScript进行简单的方法:
const books = [
{"book": "Typescript 1", "year": "2015", "units": 1000},
{"book": "Javascript 1", "year": "2015", "units": 2000},
{"book": "Typescript 1", "year": "2016", "units": 6000}
];
const merged = Object.values(books.reduce((acc, { book, year, units }) => {
acc[book] = acc[book] || { book, series: [] };
acc[book].series.push({ year, units });
return acc;
}, {}));
console.log(merged);
我将提供一种不使用打字稿的起点方法。如果您需要更多帮助,您应该告诉我们您的方法。
var original = [
{"book": "Typescript 1", "year": "2015", "units": 1000},
{"book": "Javascript 1", "year": "2015", "units": 2000},
{"book": "Typescript1", "year": "2016", "units": 6000}
];
const mapBook = new Map();
original.forEach((value) => {
const year = value['year'];
const book = value['book'];
const units = value['units'];
if(!mapBook.has(book)) {
const mapYear = new Map();
mapYear.set(year, units);
mapBook.set(book, mapYear);
} else {
const mapYear = mapBook.get(book);
if(mapYear.has(year)){
//Decide what to do if it is reapeted
} else {
mapYear.set(year, units);
mapBook.set(book, mapYear);
}
}
});
const mapBookIterator = mapBook.entries();
for(let [key, value] of mapBookIterator ){
//iterate your entries and build your object
console.log(key, value);
}