打字稿/ Lodash - 串联数据

问题描述 投票:0回答:3

我试图弄清楚如何将值分组。例如,我想转换下面的数据

[
    {"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}
         ]   
    } 
]
typescript lodash
3个回答
1
投票

请阅读"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是您要转换的数组。


0
投票

这是使用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);

-1
投票

我将提供一种不使用打字稿的起点方法。如果您需要更多帮助,您应该告诉我们您的方法。

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);
}
© www.soinside.com 2019 - 2024. All rights reserved.