【问题标题】:Merge results from json arrays by date按日期合并来自 json 数组的结果
【发布时间】:2020-07-16 01:55:46
【问题描述】:

我正在尝试在 jQuery 中合并来自给定 JSON 的结果。 目前,我一直在尝试在这里使用 sn-ps:Merge Json array date based,但我没有任何运气达到我需要的最终结果。

当前结果:

[
  {
    "searches": "37",
    "views": "0",
    "leads": "0",
    "fliers": "0",
    "website": "0",
    "calls": "0",
    "shares": "0",
    "date": "2019-12-31"
  },
  {
    "searches": "0",
    "views": "6",
    "leads": "0",
    "fliers": "0",
    "website": "0",
    "calls": "0",
    "shares": "0",
    "date": "2019-12-31"
  },
  {
    "searches": "68",
    "views": "0",
    "leads": "0",
    "fliers": "0",
    "website": "0",
    "calls": "0",
    "shares": "0",
    "date": "2020-01-01"
  },
  {
    "searches": "0",
    "views": "6",
    "leads": "0",
    "fliers": "0",
    "website": "0",
    "calls": "0",
    "shares": "0",
    "date": "2020-01-01"
  }
]

要达到的结果:

[
  {
    "searches": "37",
    "views": "6",
    "leads": "0",
    "fliers": "0",
    "website": "0",
    "calls": "0",
    "shares": "0",
    "date": "2019-12-31"
  },
  {
    "searches": "68",
    "views": "6",
    "leads": "0",
    "fliers": "0",
    "website": "0",
    "calls": "0",
    "shares": "0",
    "date": "2020-01-01"
  },
]

任何帮助将不胜感激!

【问题讨论】:

  • 你可以试试这个: let arrayOfJSONObjects=[{你的数组值在这里 }] for(let i=0;i
  • @user3189162 为什么不把它放在答案中?
  • 其实我没有测试答案,这是一个快速响应
  • 你可以试试这个编辑过的: let arrayOfJSONObjects=[{your array values here }] for(let i=0;i
  • 感谢您的帮助,但遗憾的是我无法正确完成这项工作。也许我做错了什么。

标签: jquery arrays json merge


【解决方案1】:

我用reduce函数做的

let merged_arr = arr.reduce((acc, cur, index, arr)=>{

    let new_acc = [];

    if(index === 1){

        new_acc.push(acc);

        if(acc.date === cur.date){

            new_acc.map((o)=>{
                o.searches = +o.searches + +cur.searches;
                o.views = +o.views + +cur.views;
                o.leads = +o.leads + +cur.leads;
                o.fliers = +o.fliers + +cur.fliers;
                o.website = +o.website + +cur.website;
                o.calls = +o.calls + +cur.calls;
                o.shares = +o.shares + +cur.shares;
            });

        } else {
            new_acc.push(cur)
        }

    } else {

        new_acc = acc;

        if( new_acc.some( (o)=>{ return Object.values(o).includes(cur.date) } ) ){

            new_acc.map((o)=>{ 
                if(o.date === cur.date){
                    o.searches = +o.searches + +cur.searches;
                    o.views = +o.views + +cur.views;
                    o.leads = +o.leads + +cur.leads;
                    o.fliers = +o.fliers + +cur.fliers;
                    o.website = +o.website + +cur.website;
                    o.calls = +o.calls + +cur.calls;
                    o.shares = +o.shares + +cur.shares;
                }
            });

        } else {
            new_acc.push(cur);
        }

    }

    return new_acc;

});

结果:

enter image description here

或者像这样:

let arr = [
  {
    "searches": "37",
    "views": "0",
    "leads": "0",
    "fliers": "0",
    "website": "0",
    "calls": "0",
    "shares": "0",
    "date": "2019-12-31"
  },
  {
    "searches": "0",
    "views": "6",
    "leads": "0",
    "fliers": "0",
    "website": "0",
    "calls": "0",
    "shares": "0",
    "date": "2019-12-31"
  },
  {
    "searches": "68",
    "views": "0",
    "leads": "0",
    "fliers": "0",
    "website": "0",
    "calls": "0",
    "shares": "0",
    "date": "2020-01-01"
  },
  {
    "searches": "0",
    "views": "6",
    "leads": "0",
    "fliers": "0",
    "website": "0",
    "calls": "0",
    "shares": "0",
    "date": "2020-01-01"
  }
];

let merged_arr = arr.reduce((acc, cur, index, arr)=>{

    let new_acc = [];

    if(index === 1){

        new_acc.push(acc);

        if(acc.date === cur.date){

            new_acc.map((o)=>{
                o.searches = (+o.searches + +cur.searches).toString();
                o.views = (+o.views + +cur.views).toString();
                o.leads = (+o.leads + +cur.leads).toString();
                o.fliers = (+o.fliers + +cur.fliers).toString();
                o.website = (+o.website + +cur.website).toString();
                o.calls = (+o.calls + +cur.calls).toString();
                o.shares = (+o.shares + +cur.shares).toString();
            });

        } else {
            new_acc.push(cur)
        }

    } else {

        new_acc = acc;

        if( new_acc.some( (o)=>{ return Object.values(o).includes(cur.date) } ) ){

            new_acc.map((o)=>{ 
                if(o.date === cur.date){
                    o.searches = (+o.searches + +cur.searches).toString();
                    o.views = (+o.views + +cur.views).toString();
                    o.leads = (+o.leads + +cur.leads).toString();
                    o.fliers = (+o.fliers + +cur.fliers).toString();
                    o.website = (+o.website + +cur.website).toString();
                    o.calls = (+o.calls + +cur.calls).toString();
                    o.shares = (+o.shares + +cur.shares).toString();
                }
            });

        } else {
            new_acc.push(cur);
        }

    }

    return new_acc;

});

console.log('merged_arr: ', merged_arr);

【讨论】:

  • 哇,非常感谢!这绝对有效。但是,我注意到一件有趣的事情,不知道为什么会这样做,但是一些数组值被包含在引号中,而其他所有值都没有。我正在谈论的图片:cdn.discordapp.com/attachments/677606397042753570/…
  • @Crum 好的,问题是,你想成为什么样的人?你想全部都在 quation 标记中吗?还是您希望数字采用 Intiger(就像现在一样)并且日期值采用 Date() 格式?如果您希望将数字转换回引号,那么您需要为该行的每个值添加:例如:o.views = (+o.views + +cur.views).toString(); .如果您不明白,请写信给我,我会为您更改代码!
  • @Crum 好的,我为您的引号问题添加了新代码:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-31
  • 2013-09-12
  • 2010-12-01
  • 1970-01-01
相关资源
最近更新 更多