首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从树结构中抓取所有“名字”

从树结构中抓取所有“名字”
EN

Stack Overflow用户
提问于 2018-09-19 18:25:24
回答 3查看 84关注 0票数 1

这里有无穷无尽的树木问题,但对我来说,如果有人能帮我解决这个问题,那就太好了。我参加了新兵训练营的“模拟面试”,这是个问题。我没有很好的方法来接近它。

代码语言:javascript
复制
const people = {
    name: "Robin",
    children: [
        {
            name: "Alberto",
            children: [
                {
                    name: "Quinn",
                    children: [
                        {
                            name: "Conner",
                            children: []
                        },
                        {
                            name: "Lila",
                            children: []
                        }
                    ]
                }
            ]
        },
        {
            name: "Charlie",
            children: []
        }
    ]
}

// Write a function called getNames that returns a string "Robin, Alberto, Quinn, Conner, Lila, Charlie

当你试图学习这些东西的时候,它可能会有点让人难以抗拒,特别是当你在筛选许多有不同角度解决它们的问题时。因此,在这方面的帮助将是非常感谢的!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-09-19 18:33:40

一种方法是将reduce方法与递归方法结合使用,在这种方法中,您可以将concat到初始的name字符串.f的输出

代码语言:javascript
复制
const people = {"name":"Robin","children":[{"name":"Alberto","children":[{"name":"Quinn","children":[{"name":"Conner","children":[]},{"name":"Lila","children":[]}]}]},{"name":"Charlie","children":[]}]}

function getNames(data, name = "") {
    return data.name + (data.children ?
      data.children.reduce((r, e) => {
        return r + ", " + getNames(e)
      }, "") : "")
}

console.log(getNames(people))

另一个递归解决方案是使用mapflatten方法,您可以选择所有名称,然后使用join方法将它们转换为字符串。

代码语言:javascript
复制
const people = {"name":"Robin","children":[{"name":"Alberto","children":[{"name":"Quinn","children":[{"name":"Conner","children":[]},{"name":"Lila","children":[]}]}]},{"name":"Charlie","children":[]}]}


function getString({ name, children }) {
  return [name, ...children.map(getString).flat()].join(', ')
}

const result = getString(people)
console.log(result)

票数 2
EN

Stack Overflow用户

发布于 2018-09-19 18:30:33

简单,只需使用递归。

代码语言:javascript
复制
const people = { name: "Robin", children: [ { name: "Alberto", children: [ { name: "Quinn", children: [ { name: "Conner", children: [] }, { name: "Lila", children: [] } ] } ] }, { name: "Charlie", } ]};

function getNames(tree) {
  var names = [];
  for (var i = 0; i < tree.length; i++) {
    names.push(tree[i].name)
    if (tree[i].children) {
      names = names.concat(getNames(tree[i].children))
    }
  }
  return names;
}
var names = getNames([people]);

console.log(names);

票数 1
EN

Stack Overflow用户

发布于 2018-09-19 20:55:52

使用新的flatMap可以轻松地转换递归数据结构。

代码语言:javascript
复制
const people =
  { name: "Robin", children: [ { name: "Alberto", children: [ { name: "Quinn", children: [ { name: "Conner", children: [] }, { name: "Lila", children: [] } ] } ] }, { name: "Charlie", } ]};

const getNames = ({ name, children = [] }) =>
  [ name, ...children.flatMap(getNames) ]
  
console.log(getNames(people))
// [ "Robin", "Alberto", "Quinn", "Conner", "Lila", "Charlie" ]

如果您的环境没有定义它,您可以编写您自己的flatMap

代码语言:javascript
复制
const flatMap = (f, xs = [], context = null) =>
  xs.reduce
    ( (acc, x, i) =>
        acc.concat (f.call (context, x, i, xs))
    , []
    )

const people =
  { name: "Robin", children: [ { name: "Alberto", children: [ { name: "Quinn", children: [ { name: "Conner", children: [] }, { name: "Lila", children: [] } ] } ] }, { name: "Charlie", } ]};

const getNames = ({ name, children = [] }) =>
  [ name, ...flatMap (getNames, children) ]
  
console.log(getNames(people))
// [ "Robin", "Alberto", "Quinn", "Conner", "Lila", "Charlie" ]

Node 11支持flatMap,但在babel-polyfill 7中不再包括它,现在必须是人工进口

代码语言:javascript
复制
// Node 10 or Babel 7
import 'core-js/fn/array/flat-map'

你可以手动填充它

代码语言:javascript
复制
// manual polyfill
Array.prototype.flatMap =
  function (f, context = null) {
    return this.reduce
      ( (acc, x, i) => 
          acc.concat (f.call (context, x, i, this))
      , []
      )
  }

const people =
  { name: "Robin", children: [ { name: "Alberto", children: [ { name: "Quinn", children: [ { name: "Conner", children: [] }, { name: "Lila", children: [] } ] } ] }, { name: "Charlie", } ]};

const getNames = ({ name, children = [] }) =>
  [ name, ...children.flatMap(getNames) ]
  
console.log(getNames(people))
// [ "Robin", "Alberto", "Quinn", "Conner", "Lila", "Charlie" ]

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52412090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档