我有两个数组,routesFeatures和stopsFeatures,它们分别包含车辆路线的属性和每个停靠点的属性。它们通过其名称属性相互关联,这意味着 stopsFeatures 中任何条目中的 RouteName 属性是否与其中的 Name 属性匹配 routesFeatures 的任何条目均表示该停靠点属于该路线。 现在,从代码角度来看,我正在尝试进行这种匹配,并将它们放置在一个二维数组中,其中每个索引都是一条路线,并且在该索引内有相应的停靠点。
这是路线特征:
[{
ObjectId: 1,
Name: "Rota 1"
},
{
ObjectId: 2,
Name: "Rota 2"
},
...
]
这是stopsFeatures:
[{
ObjectId: 1,
Name: "Carga 0",
RouteName: "Rota 2"
},
{
ObjectId: 2,
Name: "Descarga 0",
RouteName: "Rota 2"
},
...,
{
ObjectId: 11,
Name: "Carga 5",
RouteName: "Rota 4"
},
...
]
这是我的功能:
function drawRoutesOptimized(routesFeatures, stopsFeatures){
var stopsRoutes = [[]];
for(var i=0; i<routesFeatures.length; i++){
// draw some stuff on screen
var count = 0;
for(var j=0; j<stopsFeatures.length; j++){
if(stopsFeatures[j].attributes.RouteName == routesFeatures[i].attributes.Name){
stopsRoutes[i][count] = stopsFeatures[j].attributes.Name;
count++;
}
}
}
}
这是stopRoutes的console.log,它按预期工作,但仅当i为0时才会崩溃:
[0]
[0] "Carga 2"
[1] "Descarga 2"
[2] "Carga 6"
[3] "Descarga 6"
[4] "Carga 7"
[5] "Descarga 7"
在我的脑海中这应该起作用,但是我得到了: 未捕获(承诺)TypeError:无法设置未定义的属性“ 0” 当我成为值1
答案 0 :(得分:1)
从逻辑上讲,这很简单
RouteName
与路线匹配的人这不是最优化的解决方案,但它可以工作。请记住,我正在使用reduce将每个路由初始化为数组。
const routesFeatures = [{
ObjectId: 1,
Name: "Rota 1"
},
{
ObjectId: 2,
Name: "Rota 2"
},
];
const stopFeatures = [{
ObjectId: 1,
Name: "Carga 0",
RouteName: "Rota 2"
},
{
ObjectId: 2,
Name: "Descarga 0",
RouteName: "Rota 2"
},
{
ObjectId: 11,
Name: "Carga 5",
RouteName: "Rota 4"
},
];
const result = routesFeatures.reduce((acc, routeFeature) => {
acc.push(stopFeatures.reduce((_acc, stopFeature) => {
if (stopFeature.RouteName === routeFeature.Name) {
_acc.push(stopFeature.RouteName)
}
return _acc;
}, []))
return acc
}, []);
console.log(result);
使用标准的for循环
const routesFeatures = [{
ObjectId: 1,
Name: "Rota 1"
},
{
ObjectId: 2,
Name: "Rota 2"
},
];
const stopsFeatures = [{
ObjectId: 1,
Name: "Carga 0",
RouteName: "Rota 2"
},
{
ObjectId: 2,
Name: "Descarga 0",
RouteName: "Rota 2"
},
{
ObjectId: 11,
Name: "Carga 5",
RouteName: "Rota 4"
},
];
function drawRoutesOptimized(routesFeatures, stopsFeatures) {
const routeStops = [];
for (let i = 0; i < routesFeatures.length; i++) {
routeStops.push([]);
const routeArray = routeStops[i];
const route = routesFeatures[i];
for (let j = 0; j < stopsFeatures.length; j++) {
const stop = stopsFeatures[j];
if (stop.RouteName === route.Name) {
routeArray.push(stop.RouteName)
}
}
}
return routeStops
}
const result = drawRoutesOptimized(routesFeatures, stopsFeatures);
console.log(result);
答案 1 :(得分:1)
不太确定您实际想要什么,因此我删除了param属性,使其可以在摘要中使用。您会错过声明子数组的机会,因此当路由无法将数据推送到该数组中时。
let routesFeatures = [{
ObjectId: 1,
Name: "Rota 1"
},
{
ObjectId: 2,
Name: "Rota 2"
}
]
let stopsFeatures = [{
ObjectId: 1,
Name: "Carga 0",
RouteName: "Rota 2"
},
{
ObjectId: 2,
Name: "Descarga 0",
RouteName: "Rota 2"
}
]
function drawRoutesOptimized(routesFeatures, stopsFeatures){
var stopsRoutes = [];
for(var i=0; i<routesFeatures.length; i++){
// draw some stuff on screen
var count = 0;
stopsRoutes[i] = [];
for(var j=0; j<stopsFeatures.length; j++){
if(stopsFeatures[j].RouteName == routesFeatures[i].Name){
stopsRoutes[i][count] = stopsFeatures[j].Name;
count++;
}
}
}
console.log(stopsRoutes)
}
drawRoutesOptimized(routesFeatures, stopsFeatures)