【问题标题】:Convert JSON array with same key value转换具有相同键值的 JSON 数组
【发布时间】:2018-02-23 07:16:35
【问题描述】:

我有一个这种形式的数组

[
        {
            "time": "2017-09-14 02:44 AM",
            "artist": "Sam",
            "message": "message 1",
            "days": 0
        },
         {
            "time": "2017-09-14 02:44 AM",
            "artist": "Jerry",
            "message": "message 2",
            "days": 2
        },
        {
            "time": "2017-09-14 02:44 AM",
            "artist": "Sam",
            "message": "message 3",
            "days": 4
        },
         {
            "time": "2017-09-14 02:49 AM",
            "artist": "Jerry",
            "message": "message 5",
            "days": 2
        },
         {
            "time": "2017-09-14 02:59 AM",
            "artist": "Sam",
            "message": "message 7",
            "days": 10
        },
        {
            "time": "2017-09-14 02:59 AM",
            "artist": "Sam",
            "message": "message 5",
            "days": 10
        },
]

我需要这样的输出

[{
    artist:"Sam",
    data : [
        {message:"message 1" , days: 0},
        {message:"message 3" , days: 4},
        {message:"message 7" , days: 10},
        {message:"message 5" , days: 10}
    ]
},
{
    artist:"Jerry",
    data : [
        {message: "message 2", days: 2},
        {message: "message 5", days: 2}
    ]
}]

非常感谢您的任何帮助。

这是我尝试过的代码,

  var obj = {};
    data.map(function(item){
        if(angular.isDefined(obj.artist) && obj.artist === item.artist){
            obj.data.push({message: item.message, days:item.days })
        }else{
            obj.artist = item.artist;
            obj.data = [];
            obj.data.push({message: item.message, days:item.days })
        }
    });
   console.log(obj);

但它会创建一个 JSON 对象。

【问题讨论】:

  • 你能分享一下你试过的东西吗?
  • 你试过的代码在哪里?
  • 我已经编辑了我的问题。代码可能对你们没有帮助。
  • @AKA 有没有帮助,SO 的目的不是提供完整的解决方案,而是引导您的解决方案朝着正确的方向发展。因此,即使您的代码是必需的,我们也可以帮助您解决导致问题的原因。
  • 嗯,疯了。您想要一个数组作为输出,但您的 var obj 是一个对象。

标签: javascript jquery html angularjs frontend


【解决方案1】:

试试这个Array#reduce函数

  1. 使用新数组推送created obj
  2. 然后只使用artist 值创建数组。
  3. 然后申请检查艺术家值是否已存在于数组中或未使用 Array#indexOf()>0.

  4. 是否存在。只是将另一个对象推入存在数据数组

  5. Array#index 用于查找新数组中出现的对象的位置

var arr = [ { "time": "2017-09-14 02:44 AM", "artist": "Sam", "message": "message 1", "days": 0 }, { "time": "2017-09-14 02:44 AM", "artist": "Jerry", "message": "message 2", "days": 2 }, { "time": "2017-09-14 02:44 AM", "artist": "Sam", "message": "message 3", "days": 4 }, { "time": "2017-09-14 02:49 AM", "artist": "Jerry", "message": "message 5", "days": 2 }, { "time": "2017-09-14 02:59 AM", "artist": "Sam", "message": "message 7", "days": 10 }, { "time": "2017-09-14 02:59 AM", "artist": "Sam", "message": "message 5", "days": 10 }, ]


var res = arr.reduce(function(a,b){
var f =a.map(i=> i.artist)
if(f.indexOf(b.artist) > 0){
  a[f.indexOf(b.artist)].data.push({message:b.message,days:b.days})
}else{
a.push({artist:b.artist, data:[{message:b.message,days:b.days}]})
}
return a;
},[])

console.log(res)

【讨论】:

  • array.includes() 在 Internet Explorer 中不起作用。
  • @AtaurRahmanMunna 谢谢。但 Internet Explorer 不支持许多事件。不仅array#includes
【解决方案2】:

您可以为同一艺术家使用哈希表并用它收集数据。

var data = [{ time: "2017-09-14 02:44 AM", artist: "Sam", message: "message 1", days: 0 }, { time: "2017-09-14 02:44 AM", artist: "Jerry", message: "message 2", days: 2 }, { time: "2017-09-14 02:44 AM", artist: "Sam", message: "message 3", days: 4 }, { time: "2017-09-14 02:49 AM", artist: "Jerry", message: "message 5", days: 2 }, { time: "2017-09-14 02:59 AM", artist: "Sam", message: "message 7", days: 10 }, { time: "2017-09-14 02:59 AM", artist: "Sam", message: "message 5", days: 10 }],
    hash = Object.create(null),
    result = data.reduce(function (r, a) {
        if (!hash[a.artist]) {
            hash[a.artist] = { artist: a.artist, data: [] };
            r.push(hash[a.artist]);
        }
        hash[a.artist].data.push({ message: a.message, days: a.days });
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 感谢 Nina,我必须说,你真的是 javascript 大师。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-04
  • 1970-01-01
相关资源
最近更新 更多