A very simple native function for unwinding a collection by a property, like MongoDB's $unwind
function.
- This function is immutable. Your original collection doesn't change.
- It works for both primitives and complex values.
- It works for nested arrays, using dot-notation. Like
a.b.c
. - It works in ES5-compatible environments, without transpiling.
$ npm i javascript-unwind --save
const unwind = require('javascript-unwind');
const collection = [
{ a: [{ x: 1 }, { x: 2 }], b: 123 },
{ a: [{ x: 3 }, { x: 4 }], b: 785, c: 368 },
];
console.log(unwind(collection, 'a'));
Output:
[ { a: { x: 1 }, b: 123 },
{ a: { x: 2 }, b: 123 },
{ a: { x: 3 }, b: 785, c: 368 },
{ a: { x: 4 }, b: 785, c: 368 } ]
const unwind = require('javascript-unwind');
const collection = [{
name: 'a1',
b: [{
name: 'b1',
c: [ { name: 'c1' }, { name: 'c2' } ]
}, {
name: 'b2',
c: [ { name: 'c3' }, { name: 'c4' } ]
},
],
}, {
name: 'a2',
b: [{
name: 'b3',
c: [ { name: 'c4' }, { name: 'c5' } ]
}, {
name: 'b4',
c: [ { name: 'c6' }, { name: 'c7' } ]
}
]
}
];
console.log(unwind(collection, 'b.c'));
Output:
[
{
"name":"a1",
"b":{
"name":"b1",
"c":{
"name":"c1"
}
}
},
{
"name":"a1",
"b":{
"name":"b1",
"c":{
"name":"c2"
}
}
},
{
"name":"a1",
"b":{
"name":"b2",
"c":{
"name":"c3"
}
}
},
{
"name":"a1",
"b":{
"name":"b2",
"c":{
"name":"c4"
}
}
},
{
"name":"a2",
"b":{
"name":"b3",
"c":{
"name":"c4"
}
}
},
{
"name":"a2",
"b":{
"name":"b3",
"c":{
"name":"c5"
}
}
},
{
"name":"a2",
"b":{
"name":"b4",
"c":{
"name":"c6"
}
}
},
{
"name":"a2",
"b":{
"name":"b4",
"c":{
"name":"c7"
}
}
}
]
See Issues.