将我的 SQL 查询结果数组中的元素与 Javascript 合并

Merging elements in my SQL query result Array with Javascript

作为新手,我正在寻找实现以下目标的最佳方法:

这是我从数据库查询中获得的数组,其中包含“class”table

上的左连接
[
{"legnumber":1,
"classcode" : "J"},
{"legnumber":1,
"classcode" : "Y"},
{"legnumber":2,
"classcode" : "J"}
]

我想得到这样的东西:


    {
            "legs": [
                    {
                    "legnumber" : 1,
                    "classes" : [
                                    {"classcode" : "J"},
                                    {"classcode" : "Y"}
                                    ] 
                    },
                    {
                    "legnumber" : 2,
                    "classes" : [
                                    {"classcode" : "J"}
                                    ]
                    }
                    ]
    }

非常感谢您的建议。 我在这个项目中使用 Sequelize,但我正在编写原始查询,因为我发现它对我的数据库模型更方便。

此致, 妮可

您可以使用 array#reduce 根据 legnumber 对数组项进行分组,然后使用 Object.values().

获取所有值以创建结果

const arr = [ {"legnumber":1, "classcode" : "J"}, {"legnumber":1, "classcode" : "Y"}, {"legnumber":2, "classcode" : "J"} ],
      output = arr.reduce((r, {legnumber, classcode}) => {
        r[legnumber] ??= {legnumber, classes: []};
        r[legnumber].classes.push({classcode});
        return r;
      },{}),
       result = {legs: Object.values(output)};
console.log(result);

哈桑的回答是处理这个问题的更简洁的方法,但这里有一个更详细的选项来帮助理解正在发生的事情:

const queryResults = [
  { legnumber: 1, classcode: 'J' },
  { legnumber: 1, classcode: 'Y' },
  { legnumber: 2, classcode: 'J' },
]

// create an object to store the transformed results
const transformedResults = {
  legs: [],
}

// loop through each item in the queryResult array
for (const result of queryResults) {

  // try to find an existing leg tha matches the current leg number
  let leg = transformedResults.legs.find((leg) => leg.legnumber === result.legnumber)

  // if it doesn't exist then create it and add it to the transformed results
  if (!leg) {
    leg = {
      legnumber: result.legnumber,
      classes: [],
    }
    transformedResults.legs.push(leg)
  }

  // push the classcode
  leg.classes.push({ classcode: result.classcode })
}

console.log(transformedResults)