我正在使用一个键对象,该对象代表时间表数据,尤其是针对特定“行程”命中的各个停靠点的时间点
因此,目前我可以得到一个停靠点列表和一个行程列表,就像这样简单地演示:
var locations = [{id: 0, name: 'A'},{id: 1, name: 'B'},{id: 2, name: 'C'},{id: 3, name: 'D'}]
var trips = [{
times: {
'0': '06:00',
'1': '06:30'
}
}, {
times: {
'1': '07:00',
'2': '07:30',
'4': '08:45'
}
}, {
times: {
'1': '07:45',
'3': '09:00'
}
}];
我想做的是,一次旅行不访问特定的站点,然后添加一个新的键控项,但是使用一个空字符串值(使用未访问的站点ID作为键值)添加一个新的键控项。
所以我想结束像这样的转换对象:
var trips = [{
times: {
'0': '06:00',
'1': '06:30',
'2': '',
'3': '',
'4': ''
}
}, {
times: {
'0': '',
'1': '07:00',
'2': '07:30',
'3': ''
'4': '08:45'
}
}, {
times: {
'0': '',
'1': '07:45',
'2': '',
'3': '09:00',
'4': ''
}
}];
我当时正在考虑遍历每个times
对象中的键,并与上一个键进行比较,以查看键值之间的差距,因此我可以尝试确定要插入多少键-但使用Object.keys(...)之类的方法不能保证键的迭代顺序,因此我不能认为这对我有帮助。
我能想到的唯一的另一种方法是将对象转换为稀疏数组,并使用原始对象的键来知道将数组项添加到什么位置,然后用空值I填充数组的间隙。需要。
有人可以在这里提供有关最佳方法的建议吗? 谢谢
答案 0 :(得分:3)
您是对的,您不能依赖按键的顺序,但是您可以使用Array.prototype.includes
来查看您的旅程是否缺少特定位置。可能有一种更聪明的方法,但这似乎可行:
var locations = [{id: 0, name: 'A'},{id: 1, name: 'B'},{id: 2, name: 'C'},{id: 3, name: 'D'}]
var trips = [{
times: {
'0': '06:00',
'1': '06:30'
}
}, {
times: {
'1': '07:00',
'2': '07:30',
'4': '08:45'
}
}, {
times: {
'1': '07:45',
'3': '09:00'
}
}];
// create an array of all the location ids
var locationIds = [];
locations.forEach(function(location){
locationIds.push('' + location.id); // convert to string before pushing because your `times` objects' keys are strings
});
trips.forEach(function(trip) {
// here are all the trips already defined:
var existingTrips = Object.keys(trip.times);
// then iterate over all locations to add the new elements where they don't exist
locationIds.forEach(function(locationId) {
// so if we don't have a trip, add a blank one!
if (!existingTrips.includes(locationId)) {
trip.times[locationId] = '';
}
})
});
console.log(trips);
答案 1 :(得分:2)
首先,我们获得所有的位置键,并将它们添加到数组中。
let keys = locations.map(o=> o.id);
使用此信息作为模板,现在我们可以循环旅行,并验证是否所有键都在每个旅行对象中。如果有问题,我们将它们添加到该对象中。
trips.forEach(o=>{
keys.forEach(k=>{
if(!(k in o.times)){
o.times[k]='0';
}
})
})
希望这会有所帮助:>
var locations = [{id: 0, name: 'A'},{id: 1, name: 'B'},{id: 2, name: 'C'},{id: 3, name: 'D'},{id: 5, name: 'D'}]
var trips = [{
times: {
'0': '06:00',
'1': '06:30'
}
}, {
times: {
'1': '07:00',
'2': '07:30',
'4': '08:45'
}
}, {
times: {
'1': '07:45',
'3': '09:00'
}
}];
let keys = locations.map(o=> o.id);
trips.forEach(o=>{
keys.forEach(k=>{
if(!(k in o.times)){
o.times[k]='0';
}
})
})
console.log(trips)
答案 2 :(得分:0)
很简单,只需尝试下面的代码,它上面有描述其工作原理的注释。
var locations = [{id: 0, name: 'A'},{id: 1, name: 'B'},{id: 2, name: 'C'},{id: 3, name: 'D'}];
var trips = [{
times: {
'0': '06:00',
'1': '06:30'
}
}, {
times: {
'1': '07:00',
'2': '07:30',
'4': '08:45'
}
}, {
times: {
'1': '07:45',
'3': '09:00'
}
}];
// you loop through the locations
locations.forEach(location=>{
// you loop through the trips
trips.forEach(trip=>{
// you check if location id is not in trip times to set trip times for that location to empty string.
if(!(location.id in trip.times)){
trip.times[location.id] = '';
}
});
});
console.log(trips);