这里有无穷无尽的树木问题,但对我来说,如果有人能帮我解决这个问题,那就太好了。我参加了新兵训练营的“模拟面试”,这是个问题。我没有很好的方法来接近它。
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当你试图学习这些东西的时候,它可能会有点让人难以抗拒,特别是当你在筛选许多有不同角度解决它们的问题时。因此,在这方面的帮助将是非常感谢的!
发布于 2018-09-19 18:33:40
一种方法是将reduce方法与递归方法结合使用,在这种方法中,您可以将concat到初始的name字符串.f的输出
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))
另一个递归解决方案是使用map和flatten方法,您可以选择所有名称,然后使用join方法将它们转换为字符串。
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)
发布于 2018-09-19 18:30:33
简单,只需使用递归。
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);
发布于 2018-09-19 20:55:52
使用新的flatMap可以轻松地转换递归数据结构。
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
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中不再包括它,现在必须是人工进口。
// Node 10 or Babel 7
import 'core-js/fn/array/flat-map'你可以手动填充它
// 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" ]
https://stackoverflow.com/questions/52412090
复制相似问题