Array#reduce
в Array#concat
известен как Array#flatMap
, который в настоящее время находится на стадии 3.Это также известно как #chain
согласно спецификации Fantasy Land Monad .
Вы можете использовать его следующим образом
const result =
bigArray .flatMap
(node => [ node, ...node.children ])
console.log (result)
// [ { bigArrayID: 1, name: 'Xpto', children: [ ... ] }
// , { childID: 1, name: 'XptoChild1' }
// , { childID: 2, name: 'XptoChild2' }
// , { bigArrayID: 2, name: 'Foo', children: [ ... ] }
// , { childID: 3, name: 'FooChild1' }
// , { childID: 4, name: 'FooChild2' }
// , { bigArrayID: 3, name: 'Bar', children: [ ... ] }
// , { childID: 5, name: 'BarChild1' }
// , { childID: 6, name: 'BarChild2' }
// ]
Если его нет в вашей среде, вы можете легко заполнить его
Array.prototype.flatMap = function (f)
{ return this.reduce
( (acc, x) =>
acc .concat (f (x))
, []
)
}
Запустить полную демонстрациюпрограммы в вашем браузере ниже
Array.prototype.flatMap = function (f)
{ return this.reduce
( (acc, x) =>
acc .concat (f (x))
, []
)
}
const bigArray =
[ { bigArrayID: 1
, name: "Xpto"
, children:
[ { childID: 1, name: "XptoChild1" }
, { childID: 2, name: "XptoChild2" }
]
}
, { bigArrayID: 2
, name: "Foo"
, children:
[ { childID: 3, name: "FooChild1" }
, { childID: 4, name: "FooChild2" }
]
}
, { bigArrayID: 3
, name: "Bar"
, children:
[ { childID: 5, name: "BarChild1" }
, { childID: 6, name: "BarChild2" }
]
}
]
const result =
bigArray .flatMap
(node => [ node, ...node.children ])
console.log (result)
// [ { bigArrayID: 1, name: 'Xpto', children: [ ... ] }
// , { childID: 1, name: 'XptoChild1' }
// , { childID: 2, name: 'XptoChild2' }
// , { bigArrayID: 2, name: 'Foo', children: [ ... ] }
// , { childID: 3, name: 'FooChild1' }
// , { childID: 4, name: 'FooChild2' }
// , { bigArrayID: 3, name: 'Bar', children: [ ... ] }
// , { childID: 5, name: 'BarChild1' }
// , { childID: 6, name: 'BarChild2' }
// ]
Если вам нужны индексы и переключение контекста, такие как Array#map
и Array#reduce
и Array#filter
, вы можете добавить их тоже
Array.prototype.flatMap = function (f, context)
{ return this.reduce
( (acc, x, i) =>
acc .concat (f .call (context, x, i, this))
, []
)
}