多维数组关联

时间:2020-11-05 10:37:51

标签: javascript arrays multidimensional-array

我有两个数组,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

2 个答案:

答案 0 :(得分:1)

从逻辑上讲,这很简单

  1. 环游路线
  2. 每条路线,经过停靠站
  3. 添加阻止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)

相关问题