Javascript 将对象转换为组合/对象数组

Javascript 将对象转换为组合/对象数组,javascript,json,underscore.js,lodash,Javascript,Json,Underscore.js,Lodash,使用lodash或下划线。我正在尝试转换此对象: { "variations": { "versions": ["sport", "generic"], "devices": ["mobile", "tablet"] } } 为此: var variations = [{ "version": "sport", "device": "mobile" }, { "version": "sport", "device": "tablet" }, { "v

使用lodash或下划线。我正在尝试转换此对象:

{
  "variations": {
    "versions": ["sport", "generic"],
    "devices": ["mobile", "tablet"]
  }
}
为此:

var variations = [{
  "version": "sport",
  "device": "mobile"
}, {
  "version": "sport",
  "device": "tablet"
}, {
  "version": "generic",
  "device": "mobile"
}, {
  "version": "generic",
  "device": "tablet"
}];

最好/最短的方法是什么?

不确定使用lodash或Undercore。但通过简单的jquery,我已经做到了这一点。看一看

var object={
  "variations": {
    "versions": ["sport", "generic"],
    "devices": ["mobile", "tablet"]
  }
};
var variations=[];
$.each(object.variations.versions, function(i, j) { 
    $.each(object.variations.devices, function(k, l) { 
        variations.push({version:j,device:l});
    });
});

我认为您需要将
对象键
设置为新的
变量名
,并进行内部对象值的组合

<script type="text/javascript">
//here I created two object keys for more clear
var json ={
  "variations": {
    "versions": ["sport", "generic"],
    "devices": ["mobile", "tablet"]
  },
  "another_variations": {
    "versions": ["sport", "generic"],
    "devices": ["mobile", "tablet"]
  }
};

for(var i in json){     
     window[i] = []; //here window[variable] will make global variable
     ver = Object.keys(json[i])[0];//Object.keys(json[i]) get object keys ~["versions","devices"]
     dev = Object.keys(json[i])[1];
    window[i].push(
    {    
    [ver]:json[i].versions[0],
    [dev]:json[i].devices[0]
    },
    {
    [ver]:json[i].versions[0],
    [dev]:json[i].devices[1]
    },
    {
    [ver]:json[i].versions[1],
    [dev]:json[i].devices[0]
    },
    {
    [ver]:json[i].versions[1],
    [dev]:json[i].devices[1]
    });    
}
console.log(variations);        //here can call object key as a variable name if you 
console.log(another_variations);//don't use `window[variable]` in above, this will print undefined error
</script>

//在这里,我创建了两个对象关键点以获得更清晰的效果
var-json={
“变化”:{
“版本”:[“运动”、“通用”],
“设备”:[“移动”、“平板电脑”]
},
“另一种变体”:{
“版本”:[“运动”、“通用”],
“设备”:[“移动”、“平板电脑”]
}
};
对于(json中的变量i){
window[i]=[];//这里window[variable]将成为全局变量
ver=Object.keys(json[i])[0];//Object.keys(json[i])获取对象键~[“版本”,“设备”]
dev=Object.keys(json[i])[1];
推(
{    
[ver]:json[i]。版本[0],
[dev]:json[i]。设备[0]
},
{
[ver]:json[i]。版本[0],
[dev]:json[i].设备[1]
},
{
[ver]:json[i].版本[1],
[dev]:json[i]。设备[0]
},
{
[ver]:json[i].版本[1],
[dev]:json[i].设备[1]
});    
}
控制台日志(变体)//这里可以调用对象键作为变量名,如果
console.log(另一个_变体)//不要在上面使用'window[variable]',这将打印未定义的错误
找到了一个解决方案,使用:

见工作:


相关/近dup:。顺便问一下,给你的问题一个更好的标题怎么样?我想你要找的是“排列”。@torazaburo-我认为是组合,因为对象不是有序的。;-)干杯,我有这样的东西。但我的想法是,我可以添加一个新的变化组合。aka:“days”:[“mon”,“wed”,“fri”]我不需要编辑代码,只需要我的JSON文件。
_.mixin({
  cartesianProductOf: function(args) {
    if (arguments.length > 1) args = _.toArray(arguments);
    // strings to arrays of letters
    args = _.map(args, opt => typeof opt === 'string' ? _.toArray(opt) : opt)
    return _.reduce(args, function(a, b) {
      return _.flatten(_.map(a, function(x) {
        return _.map(b, function(y) {
          return _.concat(x, [y]);
        });
      }), true);
    }, [
      []
    ]);
  },
  cartesianProductObj: function(optObj) {
    var keys = _.keys(optObj);
    var opts = _.values(optObj);
    var combs = _.cartesianProductOf(opts);
    return _.map(combs, function(comb) {
      return _.zipObject(keys, comb);
    });
  }
});