【问题标题】:Two object merge with two dates matching all records两个对象合并,两个日期匹配所有记录
【发布时间】:2021-09-03 11:37:51
【问题描述】:

如何在两个日期范围内合并两个对象?我尝试了以下 sn-ps 但重复的日期也需要更新。但现在它只更新匹配的值。

let dateRange =  [
  { Date: '2021-06-10' },
  { Date: '2021-06-11' },
  { Date: '2021-06-12' },
  { Date: '2021-06-13' },
  { Date: '2021-06-24' },
  { Date: '2021-06-25' },
  { Date: '2021-06-26' },
  { Date: '2021-06-27' }
]
let result = [
    {
      Type: 'Production',
      Date: '2021-06-26'
    },
    { Type: 'Production',
     Date: '2021-06-24'
    {
      Type: 'Production',
      Date: '2021-06-24'
    },
    {
      Type: 'Production',
      Date: '2021-06-25'
    },
    {
      Type: 'Production',
      Date: '2021-06-25'
    }
    ]

预期结果:

[
  { Date: '2021-06-10' },
  { Date: '2021-06-11' },
  { Date: '2021-06-12' },
  { Date: '2021-06-13' },
    { Type: 'Production',
     Date: '2021-06-24'
    {
      Type: 'Production',
      Date: '2021-06-24'
    },
    {
      Type: 'Production',
      Date: '2021-06-25'
    },
    {
      Type: 'Production',
      Date: '2021-06-25'
    },
    {
      Type: 'Production',
      Date: '2021-06-26'
    },
    { Date: '2021-06-27' }
    ]

我的做法:

let jsonObj = dateRange.map((range) => {
let result = result.find(({ Date }) => range.Date ==Date);
   return { ...range, ...result };
 });

但它只返回唯一值。

【问题讨论】:

    标签: javascript arrays typescript object


    【解决方案1】:

    对您生成的result 数组使用以下函数。

    const trueUnique = (arr) =>
          [...new Set(arr.map(JSON.stringify))]
          .map(res => JSON.parse(res))
    

    使用创建唯一列表 ([...new Set(arr)]) 的常规方法不起作用,因为 JavaScript 仅与 Set() 构造函数进行浅比较。但它可以轻松比较字符串,因此使用JSON.stringifyJSON.parse 您可以使用您的算法使用result,并使用trueUnique() 使结果独一无二

    编辑: 此代码将使用重复项正确创建列表

    const withDuplicates = (range, result) => {
        const datesOnly = Object.fromEntries(result.map((obj, i) => [JSON.stringify(obj.Date), i]))
        const diffRange = range.reduce((acc, cur) => {
            if (!(JSON.stringify(cur.Date) in datesOnly)) return [...acc, {Date: cur['Date']}]
            else return acc
        }, [])
        return [...diffRange, result]
    }
    

    【讨论】:

    • 感谢您的回答。但我也需要重复的日期值。请看看我的预期结果。
    【解决方案2】:
    let jsonObjMerged:any[] = [...result, ...dateRange]
       .reduce( (b:any[],a:any) => (a.Type || !b.some(e => e.Date === a.Date) ? [...b, a] : b),[])
       .sort((a:any,b:any) => new Date(a.Date).valueOf() - new Date(b.Date).valueOf());
    

    由于 Tyescript 输入,这不会在 sn-p 中运行,但您可以测试它at TS Playground

    let dateRange:any[] = [
    {Date: '2021-06-10'},
    {Date: '2021-06-11'},
    {Date: '2021-06-12'},
    {Date: '2021-06-13'},
    {Date: '2021-06-24'},
    {Date: '2021-06-25'},
    {Date: '2021-06-26'},
    { Date: '2021-06-27'}]
    
    let result:any[] = [
        {Type: 'Production', Date: '2021-06-26'},
        {Type: 'Production', Date: '2021-06-24'},
        {Type: 'Production', Date: '2021-06-24'},
        {Type: 'Production', Date: '2021-06-25'},
        {Type: 'Production', Date: '2021-06-25'}]
    
    //Typescript Version
    let jsonObjMerged:any[] = [...result, ...dateRange].reduce( (b:any[],a:any) => (a.Type || !b.some(e => e.Date === a.Date) ? [...b, a] : b),[]).sort((a:any,b:any) => new Date(a.Date).valueOf() - new Date(b.Date).valueOf());
    console.log('jsonObjMerged:',jsonObjMerged);    

    【讨论】:

    • 感谢您的回答。您的代码正在返回唯一值。我已经进入了我的代码。我也想要重复的日期值。我希望你明白了。
    • 它在 Typescript 中不起作用。我收到以下错误:算术运算的左侧必须是“any”、“number”、“bigint”或枚举类型。
    • 谢谢@Kinglish 我添加了新的日期(a.Date).valueOf() - 新的日期(b.Date).valueOf()); -> 价值()。它的工作。非常感谢
    • 太棒了!我试图弄清楚如何在该行上有一个 TS 的 断言。 valueOf() 是完美的。答案已更新,希望它有助于解决您的问题。
    • 酷。除非您仍在等待其他答案,否则请接受此答案。干杯!
    猜你喜欢
    • 2021-06-23
    • 2011-06-29
    • 2018-07-01
    • 2016-08-04
    • 1970-01-01
    • 2019-11-12
    • 1970-01-01
    • 1970-01-01
    • 2022-09-29
    相关资源
    最近更新 更多