如何操作此数组,得到如下的笛卡尔积?求高效方法

//数组长度不固定
const spec = [
  { label: '颜色', content: ['红色', '黑色', '蓝色'] },
  { label: '产地', content: ['杭州', '贵州', '商州'] },
  { label: '尺寸', content: ['大号', '中号', '小号'] }
];

//操作spec得到如下datas,spec0,spec1,spec2是动态对应spec数组的顺序,总共生成27个对象

const datas = [
  {
    spec0: '红色',
    spec1: '杭州',
    spec2: '大号'
  },
  {
    spec0: '红色',
    spec1: '杭州',
    spec2: '中号'
  },
  {
    spec0: '红色',
    spec1: '杭州',
    spec2: '小号'
  },
  {
    spec0: '红色',
    spec1: '贵州',
    spec2: '大号'
  },
  {
    spec0: '红色',
    spec1: '贵州',
    spec2: '中号'
  },
  {
    spec0: '红色',
    spec1: '贵州',
    spec2: '小号'
  },
  {
    spec0: '红色',
    spec1: '商州',
    spec2: '大号'
  },
  {
    spec0: '红色',
    spec1: '商州',
    spec2: '中号'
  },
  {
    spec0: '红色',
    spec1: '商州',
    spec2: '小号'
  }
  //.....
];
阅读 3k
3 个回答
In [1]: import itertools

In [2]: list(itertools.product(['红色', '黑色', '蓝色'], ['杭州', '贵州', '商州'], ['大号', '中号', '小号']))
Out[2]: 
[('红色', '杭州', '大号'),
 ('红色', '杭州', '中号'),
 ('红色', '杭州', '小号'),
 ('红色', '贵州', '大号'),
 ('红色', '贵州', '中号'),
 ('红色', '贵州', '小号'),
 ('红色', '商州', '大号'),
 ('红色', '商州', '中号'),
 ('红色', '商州', '小号'),
 ('黑色', '杭州', '大号'),
 ('黑色', '杭州', '中号'),
 ('黑色', '杭州', '小号'),
 ('黑色', '贵州', '大号'),
 ('黑色', '贵州', '中号'),
 ('黑色', '贵州', '小号'),
 ('黑色', '商州', '大号'),
 ('黑色', '商州', '中号'),
 ('黑色', '商州', '小号'),
 ('蓝色', '杭州', '大号'),
 ('蓝色', '杭州', '中号'),
 ('蓝色', '杭州', '小号'),
 ('蓝色', '贵州', '大号'),
 ('蓝色', '贵州', '中号'),
 ('蓝色', '贵州', '小号'),
 ('蓝色', '商州', '大号'),
 ('蓝色', '商州', '中号'),
 ('蓝色', '商州', '小号')]
参考python itertools.product的实现
function product(pools) {
    result = [[]]
    pools.forEach(pool => {
        // python中一行 result = [x+[y] for x in result for y in pool]
        r1 = []
        result.forEach(x => {
            pool.forEach(y => {
                r1.push(x.concat(y))
            })
        })
        result = r1
    })
    return result   
}

datas = product(spec.map(o=>o.content)).map(o=>{return {"spec0": o[0], "spec1": o[1], "spec2": o[2]}})
console.log(datas)

<?php
//数组长度不固定
$sets = [

['红色', '黑色', '蓝色'],
['杭州', '贵州', '商州'],
['大号', '中号']

];

function fuck($sets)
{

// 保存结果
$result = [];
// 循环遍历集合数据
for ($i = 0, $count = count($sets); $i < $count - 1; $i++) {
    // 初始化
    if ($i == 0) {
        $result = $sets[$i];
    }
    // 保存临时数据
    $tmp = [];
    // 结果与下一个集合计算笛卡尔积
    foreach ($result as $res) {
        foreach ($sets[$i + 1] as $set) {
            $tmp[] = $res . $set;
        }
    }
    // 将笛卡尔积写入结果
    $result = $tmp;
}

return $result;

}

var_dump(fuck($sets));

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题