Javascript 使用下划线展开功能
我需要mongodb的Javascript 使用下划线展开功能,javascript,underscore.js,Javascript,Underscore.js,我需要mongodb的$unwind类似于下划线的功能,以便 [{ groups: [{ name: 'test 1' }, { name: 'test 2' }], id: 1 }] 变成 [{ id: 1, group: { name: 'test 1' } }, { id: 1, group: { name: 'test 2' } }] 这可以用下划线来完成吗 可以为目标字段中的每个元素映射
$unwind
类似于下划线的功能,以便
[{
groups: [{ name: 'test 1' }, { name: 'test 2' }],
id: 1
}]
变成
[{
id: 1,
group: {
name: 'test 1'
}
}, {
id: 1,
group: {
name: 'test 2'
}
}]
这可以用下划线来完成吗 可以为目标字段中的每个元素映射一个新对象。例如,使用mixin并假设您想要一个类似于
的方法签名。展开(对象、字段)
:
您可以这样使用它:
_.unwind({
groups: [{ name: 'test 1' }, { name: 'test 2' }],
id: 1
}, 'groups');
及
- 小提琴
- 片段
功能日志(obj){
document.getElementById('logged').innerHTML++=''+JSON.stringify(obj)+'';
}
_.米辛({
展开:功能(o,字段){
返回映射(o[field],函数(val){
克隆变量=\ u0.clone(o);
克隆的[field]=val;
返回克隆;
});
}
});
变量o={u id:1,项:“ABC1”,大小:[“S”、“M”、“L”]};
原木(u.unwind(o,'尺寸'));
变量g={
组:[{name:'test 1'},{name:'test 2'}],
身份证号码:1
};
日志(u.unwind(g,'组'))代码>
您可以为目标字段中的每个元素映射一个新对象。例如,使用mixin并假设您想要一个类似于的方法签名。展开(对象、字段)
:
您可以这样使用它:
_.unwind({
groups: [{ name: 'test 1' }, { name: 'test 2' }],
id: 1
}, 'groups');
及
- 小提琴
- 片段
功能日志(obj){
document.getElementById('logged').innerHTML++=''+JSON.stringify(obj)+'';
}
_.米辛({
展开:功能(o,字段){
返回映射(o[field],函数(val){
克隆变量=\ u0.clone(o);
克隆的[field]=val;
返回克隆;
});
}
});
变量o={u id:1,项:“ABC1”,大小:[“S”、“M”、“L”]};
原木(u.unwind(o,'尺寸'));
变量g={
组:[{name:'test 1'},{name:'test 2'}],
身份证号码:1
};
日志(u.unwind(g,'组'))代码>
如果要添加目标字段,可以使用下面的代码段。这是根据@nikoshr的答案进行的修改
功能日志(obj){
document.getElementById('logged').innerHTML++=''+JSON.stringify(obj)+'';
}
_.米辛({
展开:功能(o、字段、toField){
如果(!toField)toField=字段;
返回映射(o[field],函数(val){
克隆变量=\ u0.clone(o);
克隆[toField]=val;
返回克隆;
});
}
});
变量o={u id:1,项:“ABC1”,大小:[“S”、“M”、“L”]};
原木(u.unwind(o,'尺寸'));
变量g={
组:[{name:'test 1'},{name:'test 2'}],
身份证号码:1
};
日志(u.unwind(g,'组','组')代码>
如果要添加目标字段,可以使用下面的代码段。这是根据@nikoshr的答案进行的修改
功能日志(obj){
document.getElementById('logged').innerHTML++=''+JSON.stringify(obj)+'';
}
_.米辛({
展开:功能(o、字段、toField){
如果(!toField)toField=字段;
返回映射(o[field],函数(val){
克隆变量=\ u0.clone(o);
克隆[toField]=val;
返回克隆;
});
}
});
变量o={u id:1,项:“ABC1”,大小:[“S”、“M”、“L”]};
原木(u.unwind(o,'尺寸'));
变量g={
组:[{name:'test 1'},{name:'test 2'}],
身份证号码:1
};
日志(u.unwind(g,'组','组')代码>
如果需要展开对象数组(更像mongodb的展开),可以使用以下功能:
function unwindBy(arr, field){
return _.transform(arr, function(r, o){
Array.prototype.push.apply(r,
_.map(o[field], function(v){ return _.set(_.clone(o), field, v); })
);
}, []);
}
ES6允许将其重写得更短,并且不依赖于第三方LIB:
function unwindBy(arr, f) {
return arr.reduce((r, o) => r.concat(o[f].map(v => ({ ...o, [f]: v }))), []);
}
例如:
unwindBy([{a:1, b:[1,2,3]}, {a:2, b:[3,4,5]}], 'b');
//[{a:1, b:1}, {a:1, b:2}, {a:1, b:3}, {a:2, b:3}, {a:2, b:4}, {a:2, b:5}]
如果需要展开对象数组(更像mongodb的展开),可以使用以下功能:
function unwindBy(arr, field){
return _.transform(arr, function(r, o){
Array.prototype.push.apply(r,
_.map(o[field], function(v){ return _.set(_.clone(o), field, v); })
);
}, []);
}
ES6允许将其重写得更短,并且不依赖于第三方LIB:
function unwindBy(arr, f) {
return arr.reduce((r, o) => r.concat(o[f].map(v => ({ ...o, [f]: v }))), []);
}
例如:
unwindBy([{a:1, b:[1,2,3]}, {a:2, b:[3,4,5]}], 'b');
//[{a:1, b:1}, {a:1, b:2}, {a:1, b:3}, {a:2, b:3}, {a:2, b:4}, {a:2, b:5}]
此函数将帮助展开json对象
var flat=新的展平();
平坦的,平坦的
此函数将帮助展开json对象
var flat=新的展平();
平坦的,平坦的 您可以退房
示例用法:
const _ = require('lodash')
require('lodash-unwind')({ injected: true })
const data = [
{
a: [ 1, 2 ],
id: 'a1'
},
{
a: [ 3, 4 ],
id: 'a2'
}]
// Use unwind as part of lodash
const output = _.unwind(data, 'a')
// [
// {
// a: 1,
// id: 'a1'
// },
// {
// a: 2,
// id: 'a1'
// },
// {
// a: 3,
// id: 'a2'
// },
// {
// a: 4,
// id: 'a2'
// }
// ]
你可以退房
示例用法:
const _ = require('lodash')
require('lodash-unwind')({ injected: true })
const data = [
{
a: [ 1, 2 ],
id: 'a1'
},
{
a: [ 3, 4 ],
id: 'a2'
}]
// Use unwind as part of lodash
const output = _.unwind(data, 'a')
// [
// {
// a: 1,
// id: 'a1'
// },
// {
// a: 2,
// id: 'a1'
// },
// {
// a: 3,
// id: 'a2'
// },
// {
// a: 4,
// id: 'a2'
// }
// ]
您可以尝试使用npm软件包查看一些。您可以尝试使用npm软件包查看一些。您可以尝试使用npm软件包
const { unwind } = require('unwind-array')
const result = unwind(
{
title: 'foobar',
topLevelArr: [1, 2]
},
{ path: 'topLevelArr' }
)
expect(result.length).to.be.equal(2)
expect(result).to.be.deep.equal([
{
title: 'foobar',
topLevelArr: 1
},
{
title: 'foobar',
topLevelArr: 2
}
])
有一个npm软件包,你可以试试
const { unwind } = require('unwind-array')
const result = unwind(
{
title: 'foobar',
topLevelArr: [1, 2]
},
{ path: 'topLevelArr' }
)
expect(result.length).to.be.equal(2)
expect(result).to.be.deep.equal([
{
title: 'foobar',
topLevelArr: 1
},
{
title: 'foobar',
topLevelArr: 2
}
])
喜欢这个,我自己就把它当作一行:constunwindby=(a,f)=>a.reduce((r,o)=>r.concat(o[f].map(v=>({…o[f]:v})),[])代码>喜欢这个,我自己把它当作一行:constunwindby=(a,f)=>a.reduce((r,o)=>r.concat(o[f].map(v=>({…o[f]:v})),[])代码>