0

我正在尝试在对象内创建一个数组

const gameItemFlagMap = await functions.fetchGameItemFlagMap(item_id);
const items = [];
const object = {
    flags: [null],
}

if (gameItemFlagMap[i].item_flag_id) { 
    for (let j = 0; j < gameItemFlagMap.length; j++) { 
        // object -> flags -> flags_id & flags_identifier
        string = "object.flags.flag_id_"
        object_name = string.concat(i);
        [object_name] = [gameItemFlagMap[i].item_flag_id];

        gameItemFlags = await functions.fetchGameItemFlags(gameItemFlagMap[i].item_flag_id);
        string = "object.flags.flag_identifier_";
        object_name = string.concat(i);
        [object_name] = [gameItemFlags[0].flag_identifier];   
    }
    items.push(object);
}

在对象内写入数组或我的语法正确时,我不在哪里放置索引值。

添加注释:

将从数据库中提取的数据大约有 20 行,但在任何给定时间只有 3-4 行与我的对象相关联。for 循环当前设置为提取与相关对象关联的正确数据。

在我的对象中,我有大部分只需要返回单个值的数据,但是从 itemFlags 中提取时,我需要能够在附加到该对象的数组中存储多个值

在以下屏幕截图中:https ://puu.sh/E86hG/e17338f20e.png您可以看到包含多个数据值的对象,并且标志是该对象中的一个空数组。我的目标是使用 for 循环向该数组添加数据,但找不到正确的语法。您可以看到flag_count设置为 4,这意味着该对象期望将 4 个条目写入该嵌套标志数组。

样本数据

item_id:17
flag_id:1
flag_identifier:“标识符A”

item_id:17
flag_id:2
flag_identifier:“标识符B”

item_id:17
flag_id:3
flag_identifier:“标识符C”

item_id:24
flag_id:4
flag_identifier:“标识符D”

item_id:24
flag_id:5
flag_identifier:“标识符E”

item_id:24
flag_id:6
flag_identifier:“标识符F”

示例数据源有 6 组可能要导入的数据,我们需要flag_idflag_identifier。当脚本在项目 17 上运行时,与该 item_id 关联的 3 组信息将被写入嵌套数组。如果我调用第 24 项,则将写入 4、5、6、D、E、F。

4

2 回答 2

0

您可以使用lodash在一行中完成。考虑以下代码:

const input = [
 {
  item_id: 17,
  flag_id: 1,
  flag_identifier: "identifier A"
 },
 {
  item_id: 17,
  flag_id: 2,
  flag_identifier: "identifier B"
 },
 {
  item_id: 17,
  flag_id: 3,
  flag_identifier: "identifier C"
 },
 {
  item_id: 24,
  flag_id: 4,
  flag_identifier: "identifier D"
 },
 {
  item_id: 24,
  flag_id: 5,
  flag_identifier: "identifier E"
 },
 {
  item_id: 24,
  flag_id: 6,
  flag_identifier: "identifier F"
 }
]

const output = _.groupBy(input, 'item_id')

/* Out for sample input would be
{
"17":[
      {"item_id":17,"flag_id":1,"flag_identifier":"identifier A"}, 
      {"item_id":17,"flag_id":2,"flag_identifier":"identifier B"}, 
      {"item_id":17,"flag_id":3,"flag_identifier":"identifier C"}
     ],

"24":[
      {"item_id":24,"flag_id":4,"flag_identifier":"identifier D"}, 
      {"item_id":24,"flag_id":5,"flag_identifier":"identifier E"}, 
      {"item_id":24,"flag_id":6,"flag_identifier":"identifier F"}
     ]
}
*/

于 2019-08-22T05:34:03.823 回答
0

您可以将问题分为两个步骤。首先将数组中存在的相同 item_id 的对象分组,然后将其推送到新数组中。下面是该过程的简单表示。

const input = [
{
 item_id: 17,
 flag_id: 1,
 flag_identifier: "identifier A"
},
{
 item_id: 17,
 flag_id: 2,
 flag_identifier: "identifier B"
},
{
 item_id: 17,
 flag_id: 3,
 flag_identifier: "identifier C"
},
{
 item_id: 24,
 flag_id: 4,
 flag_identifier: "identifier D"
},
{
 item_id: 24,
 flag_id: 5,
 flag_identifier: "identifier E"
},
{
 item_id: 24,
 flag_id: 6,
 flag_identifier: "identifier F"
}];

//grouping the objects with same item_id
let data = {}

input.forEach((item) => {
  const flagData = {
    flag_id: item.flag_id,
    flag_identifier: item.flag_identifier,
  }

  if (!data[item.item_id]) {
      const val = {
        id: item.item_id,
        flags: [flagData]
      };

     data[item.item_id] = val;

    } else {
      data[item.item_id].flags = [...data[item.item_id].flags, flagData];
  }
})
//pushing the grouped values in new array
let ans = [];

 Object.keys(data).forEach((key) => {
   ans = [...ans, data[key]];
 });
 /*Output would be like     
[{
  flags: [
    0: {flag_id: 1, flag_identifier: "identifier A"}
    1: {flag_id: 2, flag_identifier: "identifier B"}
    2: {flag_id: 3, flag_identifier: "identifier C"}
  ],
  id: 17,
 },
 {
  {id: 24, flags: Array(3)}
 }
*/
于 2019-08-22T06:57:03.787 回答