[英]Grabbing all the “names” from a tree structure
這里有無數的樹問題,但是對我來說,如果有人可以幫助我解決這個特定問題,那將是很好的。 我參加了新兵訓練營的“模擬面試”,這是一個問題。 我沒有一個很好的方法來解決它。
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
當您嘗試學習這些東西時,可能會有些不知所措,尤其是當您在篩選具有不同角度解決問題的大量問題時。 因此,非常感謝您對此特定的幫助!
您可以使用reduce
方法創建將返回字符串的遞歸函數。
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))
簡單,只需使用遞歸即可。
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);
可以使用新的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" ]
節點11支持flatMap
,但從Babel 7開始不再包含在babel-polyfill
中,現在必須手動將其導入
// 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" ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.