【问题标题】:I Need to flatten an array我需要展平一个数组
【发布时间】:2018-05-20 20:00:58
【问题描述】:

我怎样才能展平我的对象数组:

var mylist = [{
    THEMEID: 1,
    TITLE: "myTheme1",
    PARENTID: 0,
    children: [{
        ITEMID: 1,
        NAME: "myItem1",
        THEMEID: 1,
        PARENTID: 1,
        TITLE: "myItem1"
      },
      {
        THEMEID: 3,
        TITLE: "mySubTheme1",
        PARENTID: 1,
        children: [{
          ITEMID: 3,
          NAME: "myItem3",
          THEMEID: 3,
          PARENTID: 2,
          TITLE: "myItem3"
        }]
      }
    ]
  },
  {
    THEMEID: 2,
    TITLE: "myTheme2",
    PARENTID: 0,
    children: [{
      ITEMID: 4,
      NAME: "myItem4",
      THEMEID: 2,
      PARENTID: 1,
      TITLE: "myItem4"
    }]
  },
  {
    THEMEID: 6,
    TITLE: "myTheme3",
    PARENTID: 0,
    children: [{
      THEMEID: 5,
      TITLE: "mySubTheme3",
      PARENTID: 1,
      children: [{
        THEMEID: 4,
        TITLE: "mySubSubTheme3",
        PARENTID: 2,
        children: [{
          ITEMID: 2,
          NAME: "myItem2",
          THEMEID: 4,
          PARENTID: 3,
          TITLE: "myItem2"
        }]
      }]
    }]
  }
];

   console.log(mylist)

在一个数组中,子数组的索引要记录在父数组的子数组中 通过将子项的索引记录在父项的子项数组中,我如何展平我的 myList 数组以获得这样的数组: 示例:

var myFLaten = [
{THEMEID: 1, TITLE: "myTheme1", PARENTID: 0, children:[1,2]},
{ITEMID: 1, NAME: "myItem1", THEMEID: 1, PARENTID: 1, TITLE: "myItem1"},
{THEMEID: 3, TITLE: "mySubTheme1", PARENTID: 1, children:[3]},
{ITEMID: 3, NAME: "myItem3", THEMEID: 3, PARENTID: 2, TITLE: "myItem3"}]

console.log(myFLaten)

【问题讨论】:

  • 你在问什么?你的“这就是我想要的”毫无意义。 0:1(index children),1:2 是什么?
  • 您的结果示例不是有效的 javascript。
  • @h2ooooooo - @TPorter **:抱歉,我刚刚更正了。总结一下我想要的,就是能够展平我的 mylist 数组以获得与 myFlatten 数组一样的结果。粗略地说,我想知道父母的孩子数组中孩子的索引:示例:**Parent0:{THEMEID:1,TITLE:“myTheme1”,PARENTID:0,孩子:[孩子索引 1,子索引 2]} , children1 : {ITEMID: 1, NAME: "myItem1", THEMEID: 1, PARENTID: 1, TITLE: "myItem1"} , children2 : {THEMEID: 3, TITLE: "mySubTheme1", PARENTID: 1, children: [index children 1]},

标签: javascript jquery arrays node.js reactjs


【解决方案1】:

您可以将最后一个子引用存储在一个闭包中并迭代给定的数组。在平面数组中插入一个新对象时,会使用插入对象的索引进行另一个插入。

var tree = [{ THEMEID: 1, TITLE: "myTheme1", PARENTID: 0, children: [{ ITEMID: 1, NAME: "myItem1", THEMEID: 1, PARENTID: 1, TITLE: "myItem1" }, { THEMEID: 3, TITLE: "mySubTheme1", PARENTID: 1, children: [{ ITEMID: 3, NAME: "myItem3", THEMEID: 3, PARENTID: 2, TITLE: "myItem3" }] }] }, { THEMEID: 2, TITLE: "myTheme2", PARENTID: 0, children: [{ ITEMID: 4, NAME: "myItem4", THEMEID: 2, PARENTID: 1, TITLE: "myItem4" }] }, { THEMEID: 6, TITLE: "myTheme3", PARENTID: 0, children: [{ THEMEID: 5, TITLE: "mySubTheme3", PARENTID: 1, children: [{ THEMEID: 4, TITLE: "mySubSubTheme3", PARENTID: 2, children: [{ ITEMID: 2, NAME: "myItem2", THEMEID: 4, PARENTID: 3, TITLE: "myItem2" }] }] }] }],
    flat = tree.reduce(function fn(parent, children) {
        return function (r, o) {
            var temp = { THEMEID: o.THEMEID, TITLE: o.TITLE, PARENTID: o.PARENTID, parentIndex: parent },
                index = r.push(temp) - 1;
            if ('ITEMID' in o) {
                temp.ITEMID = o.ITEMID;
            }
            children.push(index);
            if (o.children) {
                o.children.reduce(fn(index, temp.children = []), r);
            }
            return r;
        };
    }(undefined, []), []);

console.log(flat);
.as-console-wrapper { max-height: 100% !important; top: 0; }

【讨论】:

  • 谢谢@NIna Scholz,最后一个问题,如果我想为临时数组中的子项添加 parentIndex 属性,我应该如何进行?我想将父母的索引保留在孩子的 parentIndex 属性中。亲切地
  • 你有你喜欢的例子吗?
  • 新属性是否应该获取父级的索引?
  • 这是一个例子:[{"THEMEID": 1, "TITLE": "myTheme1", "PARENTID": 0, "children": [1,2], depth: 1}, {“THEMEID”:1,“TITLE”:“myItem1”,“PARENTID”:1,“ITEMID”:1,深度:2,parentIndex:0},{“THEMEID”:3,“TITLE”:“mySubTheme1” “PARENTID”:1,“children”:[3],深度:2,parentIndex:0},{“THEMEID”:3,“TITLE”:“myItem3”,“PARENTID”:2,“ITEMID”:3 ,深度:3,父索引:1}]
  • 实际上它保存了索引。如果您想拥有父索引,则只需使用它而不是 index
猜你喜欢
  • 2021-05-20
  • 2021-10-24
  • 2019-11-17
  • 2014-08-29
  • 2021-02-06
  • 2014-08-19
  • 2021-10-07
  • 1970-01-01
  • 2018-08-30
相关资源
最近更新 更多