【问题标题】:how to flat array js如何扁平化js
【发布时间】:2018-05-24 09:23:35
【问题描述】:

如何展平这个数组:

[
  {ID: 0 , TITLE: 'A', children: [{ID: 1, TITLE: 'AA'}]},
  {ID: 2 , TITLE: 'B', children: []},
  {ID: 3 , TITLE: 'C', children: [{ID: 4, TITLE: 'CC', children:[{ID: 5, TITLE: 'CCC'}]}]}
]

要得到这样的东西:

  • 一个
  • A / AA
  • B
  • C / CC / CCC

【问题讨论】:

  • 什么不起作用?
  • to get sth like this 那应该是什么???

标签: javascript jquery arrays node.js


【解决方案1】:

您可以使用存储实际对象的嵌套项并采用迭代和递归方法,并在路径上使用闭包。

对于递增的ID,如果找到新行,您可以使用附加变量进行递增,或者在给定数组的末尾迭代并将索引添加为id

这个提议使用了一个额外的id 变量,因为它不需要额外的循环。

var array = [{ ID: 0, TITLE: 'A', children: [{ ID: 1, TITLE: 'AA' }] }, { ID: 2, TITLE: 'B', children: [] }, { ID: 3, TITLE: 'C', children: [{ ID: 4, TITLE: 'CC', children: [{ ID: 5, TITLE: 'CCC' }] }] }],
    id = 0,
    result = array.reduce(function f(p) {
        return function (r, o) {
            var temp = p.concat(o.TITLE);
            r.push({ ID: id++, TITLE: temp.join('/') });
            if (o.children) {
                o.children.reduce(f(temp), r);
            }
            return r;
        };
    }([]), []);

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

【讨论】:

  • 这对我来说是最好的解决方案。 gj尼娜
  • 实际上,这不是 OP 想要的,您只是将 children 与他们的 parents 分开。
  • @chsdk,实际上 op 并没有给出想要的结果。它看起来像一个扁平的,但是A 看起来很奇怪。
  • 如果您不知道 OP 想要的结果是什么,为什么要回答?另外,请鼓励 OP 表现出努力,而不是仅仅灌输答案。
  • @DeGiovanni,请将此信息添加到问题您的代码中。
【解决方案2】:

这里没有必要让事情复杂化,你只需要一个循环遍历数组项的函数,获取它们的TITLE,如果该项有children,我们递归调用该函数:

function getLevels(array, parent) {
  var results = [];
  array.forEach(function(el) {
    results.push(!parent ? el["TITLE"] : parent + "/" + el["TITLE"]);
    let prefix = parent ? parent + "/" + el["TITLE"] : el["TITLE"];
    if (el.children && el.children.length > 0) {
      getLevels(el.children, prefix).forEach(function(child) {
        results.push(child);
      });
    }
  });
  return results;
}

演示:

var arr = [{
    ID: 0,
    TITLE: 'A',
    children: [{
      ID: 1,
      TITLE: 'AA'
    }]
  },
  {
    ID: 2,
    TITLE: 'B',
    children: []
  },
  {
    ID: 3,
    TITLE: 'C',
    children: [{
      ID: 4,
      TITLE: 'CC',
      children: [{
        ID: 5,
        TITLE: 'CCC'
      }]
    }]
  }
];

function getLevels(array, parent) {
  var results = [];
  array.forEach(function(el) {
    results.push(!parent ? el["TITLE"] : parent + "/" + el["TITLE"]);
    let prefix = parent ? parent + "/" + el["TITLE"] : el["TITLE"];
    if (el.children && el.children.length > 0) {
      getLevels(el.children, prefix).forEach(function(child) {
        results.push(child);
      });
    }
  });
  return results;
}

console.log(getLevels(arr));

编辑:

这是如何继续在数组中获取id

results.push({
  "ID": el["ID"],
  "TITLE": (!parent ? el["TITLE"] : parent + "/" + el["TITLE"])
});

演示:

var arr = [{
    ID: 0,
    TITLE: 'A',
    children: [{
      ID: 1,
      TITLE: 'AA'
    }]
  },
  {
    ID: 2,
    TITLE: 'B',
    children: []
  },
  {
    ID: 3,
    TITLE: 'C',
    children: [{
      ID: 4,
      TITLE: 'CC',
      children: [{
        ID: 5,
        TITLE: 'CCC'
      }]
    }]
  }
];

function getLevels(array, parent) {
  var results = [];
  array.forEach(function(el) {
    results.push({
      "ID": el["ID"],
      "TITLE": (!parent ? el["TITLE"] : parent + "/" + el["TITLE"])
    });
    let prefix = parent ? parent + "/" + el["TITLE"] : el["TITLE"];
    if (el.children && el.children.length > 0) {
      getLevels(el.children, prefix).forEach(function(child) {
        results.push(child);
      });
    }
  });
  return results;
}

console.log(getLevels(arr));

【讨论】:

  • 我想要这样的结果:A、A/AA、B、C、C/CC、C/CC/CCC
  • @DeGiovanni 我编辑了答案,现在,它完全符合您想要的输出。
  • @chsdk 如何添加对应于数组中每个项目的 id?有这样的例子: [{ID : 0 , TITLE: A}, {ID : 1 , TITLE: A / AA}, {ID : 2 , TITLE: B}, {ID : 3 , TITLE: C}, {ID : 4 , TITLE: C / CC}, {ID : 5 , TITLE: C / CC / CCC}].
  • @chsdk 谢谢,因为我也需要获取每个项目的 ID。谢谢你哦
  • @DeGiovanni 欢迎您,很高兴它有帮助。这完全是关于如何处理您的数组及其对象。 :)
【解决方案3】:

你想要这样的东西吗?

function merge(input, flat_array) {
  if (!flat_array) {
    // this is the initial recursive call, make the input
    // (an array) have the same { child:[] } structure
    // as children calls will end up having
    flat_array = [];
    input = { children: input };
  } else {
    // since the parent call is just a plain array it doesnt
    // have a title so dont bother inserting anything
    flat_array.push(input.TITLE);
  }
  for (let i in input.children) {
    // recursively merge the children in into the flat array
    // too
    merge(input.children[i], flat_array);
  }
  return flat_array;
}

merge(x);

产生:

["A", "AA", "B", "C", "CC", "CCC"]

【讨论】:

  • 其实这不是OP要找的。​​span>
  • 不,我想要这样的结果:A、A/AA、B、C、C/CC、C/CC/CCC
  • @DeGiovanni,你需要数组、对象、字符串...作为输出吗?是的,也改变你的问题:你需要显示级别,对吧?
猜你喜欢
  • 2021-03-29
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 1970-01-01
  • 2019-12-13
  • 2017-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多