在Javascript中使用另一个结构创建新数组

时间:2017-05-22 14:23:12

标签: javascript arrays structure

我想基于原始数组但使用合并数据创建一个新数组。

每个名称键需要合并日期+时间(格式:YYYY-MM-DD HH:MM)并合并分数。所有唯一日期时间都需要作为每个名称的键。

ARRAY ORIGINAL:

"data": [{
        "name": "A",
        "history": [{
                "created": "2017-05-16 00:00:00",
                "score": "1"
            },
            {
                "created": "2017-05-16 00:01:10",
                "score": "1"
            },
            {
                "created": "2017-05-16 00:01:30",
                "score": "1"
            }
        ]
    },
    {
        "name": "B",
        "history": [{
            "created": "2017-05-16 00:01:00",
            "score": "1"
        }]
    }
]

我想要的阵列:

{ 
  [A]: { 
    "2017-05-16 00:00": 1, 
    "2017-05-16 00:01": 2 
  },  
  [B]: { 
    "2017-05-16 00:00": 0, 
    "2017-05-16 00:01": 1 
  } 
} 

我希望你们能帮助我。不幸的是,我甚至无法想到一种有效的方法。我尝试用5 foreach个语句解决这个问题而没有运气:(

2 个答案:

答案 0 :(得分:0)

您必须创建一个不是数组的对象,因为数组在javascript中不能有键值对。 javascript中没有关联数组概念。你必须在javascript中使用对象。

以下是使用对象实现目标的方法。

value = {
   "data": [{
       "name": "A",
       "history": [{
       "created": "2017-05-16 00:00:00",
       "score": "1"
     },
     {
       "created": "2017-05-16 00:01:10",
       "score": "1"
     },
     {
       "created": "2017-05-16 00:01:30",
       "score": "1"
     }
   ]},
   {
     "name": "B",
     "history": [{
       "created": "2017-05-16 00:01:00",
       "score": "1"
     }]
   }]
  };

var result ={};
value.data.forEach(function(v){
  var score = {};
  for(var i=0;i<v.history.length;i++){
   score[v.history[i].created] = v.history[i].score;
  }
  result[v.name] = score;
});

console.log(result);

现在,您可以result.A or result[A]result.B or result[B]

访问数据了

<强>段

value = {
  "data": [{
      "name": "A",
      "history": [{
          "created": "2017-05-16 00:00:00",
          "score": "1"
        },
        {
          "created": "2017-05-16 00:01:10",
          "score": "1"
        },
        {
          "created": "2017-05-16 00:01:30",
          "score": "1"
        }
      ]
    },
    {
      "name": "B",
      "history": [{
        "created": "2017-05-16 00:01:00",
        "score": "1"
      }]
    }
  ]
};

var result = {};
value.data.forEach(function(v) {
  var score = {};
  for (var i = 0; i < v.history.length; i++) {
    score[v.history[i].created] = v.history[i].score;
  }
  result[v.name] = score;
});

console.log(result);

答案 1 :(得分:0)

您可以使用两个数组作为名称和时间作为闭包,并为所有名称生成,并为具有零值的属性计时。

var data = { data: [{ name: "A", history: [{ created: "2017-05-16 00:00:00", score: "1" }, { created: "2017-05-16 00:01:10", score: "1" }, { created: "2017-05-16 00:01:30", score: "1" }] }, { name: "B", history: [{ created: "2017-05-16 00:01:00", score: "1" }] }] },
    result = data.data.reduce(function (names, times) {
        return function (r, a) {
            if (!r[a.name]) {
                r[a.name] = {};
                times.forEach(function (time) {
                    r[a.name][time] = 0;
                });
                names.push(a.name);
            }
            a.history.forEach(function (o) {
                var time = o.created.slice(0, 16);
                if (times.indexOf(time) === -1) {
                    names.forEach(function (name) {
                        r[name][time] = 0;
                    });
                    times.push(time);
                }
                r[a.name][time] += +o.score;
            });
            return r;
        };
    }([], []), {});

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