如何写入对象内的嵌套数组

时间:2019-08-22 04:16:46

标签: javascript

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

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。

2 个答案:

答案 0 :(得分: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"}
     ]
}
*/

答案 1 :(得分: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)}
 }
*/
相关问题