我試圖question在這個深層嵌套陣列中找到型別等于的所有物件:
{
"uuid": "707a5ffd-68e2-4dbd-b539-128512ba3a0a",
"type": "page",
"items": [
{
"uuid": "9d823429-cc24-444d-a21c-a81357305851",
"title": "1",
"type": "question",
},
{
"type": "section",
"title": "2",
"uuid": "346dec94-124c-4932-bd40-af9dc68f1d27",
"items": [
{
"uuid": "bf0a9ab9-99cc-4833-b3d3-84a97072e85f",
"title": "2.1",
"type": "question",
}
],
},
{
"type": "section",
"title": "3",
"uuid": "4964096d-0de9-4ab1-ace5-e42516d6b866",
"items": [
{
"uuid": "b2170580-1e2e-4fb4-a7b9-a56b79db21b3",
"title": "3.1",
"type": "question",
}
],
}
],
"params": {
"collapsed": false
}
}
到目前為止,我有以下演算法來橫向深入陣列:
export const findQuestions = (items, item = undefined, questions = []) => {
const _questions = [...questions];
if (
item !== undefined
&& !Object.prototype.hasOwnProperty.call(item, 'items')
) {
return _questions;
}
for (const _item of items) {
if (_item.type === 'question') {
_questions.push(_item);
}
if (Object.prototype.hasOwnProperty.call(_item, 'items')) {
return findQuestions(_item.items, _item, _questions);
}
}
return _questions;
};
我findQuestions通過傳遞上面參考的物件來呼叫:
const questions = findQuestions([this.lastPage]);
不幸的是,演算法在 處停止2.1并且不會橫向向上3.1。我的目標是擁有一個包含 all 的陣列questions:
[
{
"title": "1",
},
{
"title": "2.1",
},
{
"title": "3.1",
}
]
我假設問題出在
if (
item !== undefined
&& !Object.prototype.hasOwnProperty.call(item, 'items')
) {
return _questions;
}
它比它應該回傳的更快。我怎樣才能獲取所有questions?
uj5u.com熱心網友回復:
您可以使用遞回函式回傳問題并遞回迭代部分:
function getQuestions(items) {
return items.flatMap(({ type, title, items }) => type === 'question' ? { title } : getQuestions(items));
}
例子:
const data = {
"uuid": "707a5ffd-68e2-4dbd-b539-128512ba3a0a",
"type": "page",
"items": [
{
"uuid": "9d823429-cc24-444d-a21c-a81357305851",
"title": "1",
"type": "question",
},
{
"type": "section",
"title": "2",
"uuid": "346dec94-124c-4932-bd40-af9dc68f1d27",
"items": [
{
"uuid": "bf0a9ab9-99cc-4833-b3d3-84a97072e85f",
"title": "2.1",
"type": "question",
}
],
},
{
"type": "section",
"title": "3",
"uuid": "4964096d-0de9-4ab1-ace5-e42516d6b866",
"items": [
{
"uuid": "b2170580-1e2e-4fb4-a7b9-a56b79db21b3",
"title": "3.1",
"type": "question",
}
],
}
],
"params": {
"collapsed": false
}
};
function getQuestions(items) {
return items.flatMap(({ type, title, items }) => type === 'question' ? { title } : getQuestions(items));
}
console.log(getQuestions(data.items));
uj5u.com熱心網友回復:
遞回解決方案:
你可以得到所有的物件與type為question為:
function getItems(obj) {
if (obj.type === "question") result.push({ title: obj.title });
if (obj.items) obj.items.forEach((o) => getItems(o));
}
const obj = {
uuid: "707a5ffd-68e2-4dbd-b539-128512ba3a0a",
type: "page",
items: [
{
uuid: "9d823429-cc24-444d-a21c-a81357305851",
title: "1",
type: "question",
},
{
type: "section",
title: "2",
uuid: "346dec94-124c-4932-bd40-af9dc68f1d27",
items: [
{
uuid: "bf0a9ab9-99cc-4833-b3d3-84a97072e85f",
title: "2.1",
type: "question",
},
],
},
{
type: "section",
title: "3",
uuid: "4964096d-0de9-4ab1-ace5-e42516d6b866",
items: [
{
uuid: "b2170580-1e2e-4fb4-a7b9-a56b79db21b3",
title: "3.1",
type: "question",
},
],
},
],
params: {
collapsed: false,
},
};
const result = [];
function getItems(obj) {
if (obj.type === "question") result.push({ title: obj.title });
if (obj.items) obj.items.forEach((o) => getItems(o));
}
getItems(obj);
console.log(result);
uj5u.com熱心網友回復:
我建議你這個解決方案
function findQuestions(array) {
const questions = [];
for (const element of array) {
if (element.type === "question") {
questions.push(element)
}
if ("items" in element) {
questions.push(findQuestions(element.items))
}
}
return questions
}
uj5u.com熱心網友回復:
這是一個簡單的遞回函式
const data = {
"uuid": "707a5ffd-68e2-4dbd-b539-128512ba3a0a",
"type": "page",
"items": [
{
"uuid": "9d823429-cc24-444d-a21c-a81357305851",
"title": "1",
"type": "question",
},
{
"type": "section",
"title": "2",
"uuid": "346dec94-124c-4932-bd40-af9dc68f1d27",
"items": [
{
"uuid": "bf0a9ab9-99cc-4833-b3d3-84a97072e85f",
"title": "2.1",
"type": "question",
}
],
},
{
"type": "section",
"title": "3",
"uuid": "4964096d-0de9-4ab1-ace5-e42516d6b866",
"items": [
{
"uuid": "b2170580-1e2e-4fb4-a7b9-a56b79db21b3",
"title": "3.1",
"type": "question",
}
],
}
],
"params": {
"collapsed": false
}
}
const getQuestions = (data) => {
let questions = []
data.items.map(d => {
if(d.type == 'question') {
questions.push({type: d.type, uutd: d.uuid, title: d.title})
}
if(d.items) {
questions = [...questions, ...getQuestions(d)]
}
})
return questions;
}
console.log(getQuestions(data))
uj5u.com熱心網友回復:
如果您有不止一層嵌套,那么嘗試使用遞回方法:
let allItems = [];
const traverseObject = (obj) => {
if (!obj.items || obj.items.length == 0)
return;
for (let item of obj.items)
{
if (item.type === 'question')
allItems.push(item);
if (item.items && item.items.length > 0)
traverseObject(item)
}
}
一個例子:
const fooJson = {
"uuid": "707a5ffd-68e2-4dbd-b539-128512ba3a0a",
"type": "page",
"items": [
{
"uuid": "9d823429-cc24-444d-a21c-a81357305851",
"title": "1",
"type": "question",
},
{
"type": "section",
"title": "2",
"uuid": "346dec94-124c-4932-bd40-af9dc68f1d27",
"items": [
{
"uuid": "bf0a9ab9-99cc-4833-b3d3-84a97072e85f",
"title": "2.1",
"type": "question",
"items": [
{
"uuid": "bf0a9ab9-99cc-4833-b3d3-84a97072e85f",
"title": "fooBar",
"type": "question",
}
],
}
],
},
{
"type": "section",
"title": "3",
"uuid": "4964096d-0de9-4ab1-ace5-e42516d6b866",
"items": [
{
"uuid": "b2170580-1e2e-4fb4-a7b9-a56b79db21b3",
"title": "3.1",
"type": "question",
}
],
}
],
"params": {
"collapsed": false
}
};
let allItems = [];
const traverseObject = (obj) => {
if (!obj.items || obj.items.length == 0)
return;
for (let item of obj.items)
{
if (item.type === 'question')
allItems.push(item);
if (item.items && item.items.length > 0)
traverseObject(item)
}
}
traverseObject(fooJson);
console.log(allItems)
uj5u.com熱心網友回復:
您可以使用遞回生成器函式:
function* get_titles(d){
if (d.type === 'question'){
yield {title:d.title}
}
for (var i of ('items' in d ? d.items : [])){
yield* get_titles(i)
}
}
var result = [...get_titles(data)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/346425.html
標籤:javascript 数组 递归
