Lo sto facendo sul client con Javascript. Voglio trasformare:Come eseguire una funzione di riduzione ricorsiva all'interno di un oggetto?
[
{
"id": 10,
"name": "Designer",
"slug": "designer",
"children": [
{
"id": 11,
"name": "UI/Visual Designer",
"slug": "ui-visual-designer",
"children": []
},
...
]
},
{
"id": 1,
"name": "Software Engineer",
"slug": "software-engineer",
"children": [
{
"id": 2,
"name": "Back-End Developer",
"slug": "back-end-developer",
"children": []
},
...
]
},
...
]
in questo:
[
{
"id": 10,
"text": "Designer"
},
{
"id": 11,
"text": "UI/Visual Designer",
},
{
"id": 1,
"text": "Software Engineer",
},
{
"id": 2,
"text": "Back-End Developer",
}
...
]
sto praticando con map
e reduce
Così sto cercando di evitare for
loop (prima cosa che ho fatto). Questo è il codice corrente che ho:
var jobNewPage = {
...
buildArrayForSelect(array) {
"use strict";
return $.extend(true, [], array).reduce(function(total, item) {
if (item.slug == 'remote') return total;
total.push({
'id' : item.id,
'text' : item.name
});
let children = item.children;
if (children && children.length) {
// TODO: We had to call the global context jobNewPage
total = total.concat(jobNewPage.buildArrayForSelect(children));
}
return total;
}, []);
},
...
}
Quindi, come potete vedere, ho dovuto chiamare jobNewPage.buildArrayForSelect(children)
di farlo in modo ricorsivo. Ho provato a chiamare this.buildArrayForSelect(children)
ma il contesto è diverso. Ritengo che questa non sia l'opzione migliore perché non voglio dipendere dal chiamare una variabile globale all'interno di una funzione nell'oggetto. Come posso migliorarlo?
È possibile mantenere 'this' se si utilizza' this.buildArrayForSelect.call (this, children) ' – TbWill4321