我有两个字典数组,看起来像这样:
var lat = [{key:"2017-09-20T11:51:32.000Z", value:50.7825333},{key:"2017-09-20T11:51:33.000Z", value:50.7826},...];
var lon = [{key:"2017-09-20T11:51:32.000Z", value:-1.3075833},{key:"2017-09-20T11:51:33.000Z", value:-1.3076},...];
你可能已经猜到一个是纬度和经度之一!
我想要一种优雅的方法将时间,lat,lon合并到一个数组中。两个数组都包含相同的键(我应该检查这种情况总是如此!)。
var latLon = [{time:"2017-09-20T11:51:32.000Z", lat:50.7825333, lon:-1.3075833},...]
我把一些东西放在一起起作用但不漂亮(即迭代两个阵列并附加到一个新阵列)但是感觉必须有一个更时尚的方式使用Object.assign和一些不错的lamdas。如果它包含任何有用的方法,我也在使用D3.js库。
答案 0 :(得分:0)
您可以使用Array#map
方法生成新数组(假设两个数组的顺序相同)。
var lat = [{key:"2017-09-20T11:51:32.000Z", value:50.7825333},{key:"2017-09-20T11:51:33.000Z", value:50.7826}];
var lon = [{key:"2017-09-20T11:51:32.000Z", value:-1.3075833},{key:"2017-09-20T11:51:33.000Z", value:-1.3076}];
var res = lat
// iterate over the first array
.map(function(o, i) {
// generate the array element
// where get values from element and
// get value from second array using
// the index
return {
time: o.key,
lat: o.value,
lon: lon[i].value
}
})
console.log(res);
// with ES6 arrow function
var res1 = lat.map((o, i) => ({time: o.key, lat: o.value, lon: lon[i].value}))
console.log(res1);
FYI:如果相关的数组元素的顺序不同,那么你需要通过比较时间值(你可以使用Array#find
方法)或者你来从第二个数组中获取元素可以生成一个hashmap来映射对象。
使用Array#find
方法:
var lat = [{key:"2017-09-20T11:51:32.000Z", value:50.7825333},{key:"2017-09-20T11:51:33.000Z", value:50.7826}];
var lon = [{key:"2017-09-20T11:51:32.000Z", value:-1.3075833},{key:"2017-09-20T11:51:33.000Z", value:-1.3076}];
var res = lat
.map(function(o) {
return {
time: o.key,
lat: o.value,
// get object by using find method
lon: lon.find(function(o1) {
return o1.key === o.key;
}).value
}
})
console.log(res);
// with ES6 arrow function
var res1 = lat.map(o => ({
time: o.key,
lat: o.value,
lon: lon.find(o1 => o1.key === o.key).value
}))
console.log(res1);
使用散列图进行引用的更有效方法:
var lat = [{key:"2017-09-20T11:51:32.000Z", value:50.7825333},{key:"2017-09-20T11:51:33.000Z", value:50.7826}];
var lon = [{key:"2017-09-20T11:51:32.000Z", value:-1.3075833},{key:"2017-09-20T11:51:33.000Z", value:-1.3076}];
// generate reference hashmap for getting
// value using the datetime string
var ref = lon.reduce(function(obj, o) {
// set reference
obj[o.key] = o.value;
// return the reference object
return obj;
// set initial value as an empty object
}, {});
var res = lat
.map(function(o) {
return {
time: o.key,
lat: o.value,
// get value from generated reference object
lon: ref[o.key]
}
})
console.log(res);
答案 1 :(得分:0)
我会避免使用find()
如果您有任何机会处理很多项目。 find()
需要在第二个数组中搜索lat中每个项目的效果。
如果您在第一个循环上构建字典并在第二个循环上创建新数组,则可以使用单个map
和reduce
执行此操作。
这也允许lat
和lon
数组处于不同的顺序。
var lat = [{key:"2017-09-20T11:51:32.000Z", value:50.7825333},{key:"2017-09-20T11:51:33.000Z", value:50.7826}];
var lon = [{key:"2017-09-20T11:51:32.000Z", value:-1.3075833},{key:"2017-09-20T11:51:33.000Z", value:-1.3076}];
var obj = lat.reduce((a, c) => (a[c.key] = {time: c.key, lat:c.value}, a), {});
var arr = lon.map(lon => Object.assign(obj[lon.key], {lon: lon.value}));
console.log(arr);

答案 2 :(得分:0)
这是基于key
时间。假设没有相同的键/次数,那么你可以这样做:
var lat = [{key:"2017-09-20T11:51:32.000Z", value:50.7825333},{key:"2017-09-20T11:51:33.000Z", value:50.7826}];
var lon = [{key:"2017-09-20T11:51:32.000Z", value:-1.3075833},{key:"2017-09-20T11:51:33.000Z", value:-1.3076}];
var obj = {}, arr = lat.concat(lon);
arr.forEach(function(x){
obj[x.key] ? obj[x.key]["lon"] = x.value : obj[x.key] = {lat: x.value, time: x.key};
});
var latlon = Object.keys(obj).map(function(x){
return obj[x];
});
您正在连接2个数组以生成一个数组。然后,您将使用时间作为关键字创建一个字典(这是假设您没有两个拉特和两个长片具有相同的时间)。既然你知道自己第一次得到了拉特,那么你的下一场关键比赛就应该是lons。