修改带有其他项目的顺序键对象

时间:2018-06-25 12:30:13

标签: javascript

我正在使用一个键对象,该对象代表时间表数据,尤其是针对特定“行程”命中的各个停靠点的时间点

因此,目前我可以得到一个停靠点列表和一个行程列表,就像这样简单地演示:

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填充数组的间隙。需要。

有人可以在这里提供有关最佳方法的建议吗? 谢谢

3 个答案:

答案 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);