Javascript 使用下划线展开功能

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' } }] 这可以用下划线来完成吗 可以为目标字段中的每个元素映射

我需要mongodb的
$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})),[])