Skip to content

请按以下要求实现 compose 方法

Posted on:2022年4月5日 at 18:14
var list = [
  ["热", "冷", "冰"],
  ["大", "中", "小"],
  ["重辣", "微辣"],
  ["重麻", "微麻"],
];

// 输出所有维度的组合,如 [['热', '冷''], ['大', '中']]  => 热+大,热+中,冷+大,冷+中

function compose(list) {
  console.log("hello world");
}

compose(list);

实现思路

本题是个 全组合 的问题。

在介绍实现思路前先介绍一下笛卡尔积(摘自百度百科):

笛卡尔乘积是指在数学中,两个集合X和Y的笛卡尔积(Cartesian product),又称直积,表示为X×Y,第一个对象是X的成员而第二个对象是Y的所有可能有序对的其中一个成员。假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。

全组合的实现,可以借鉴笛卡尔积的求法,实现思路如下:

代码实现

function combination (list) {
	let result = []
  if (!list.length) return result
  for (let subList of list) {
    if (!result.length) {
      result = subList.map(item => [item])
    } else {
      let subResult = []
      for (let r of result) {
        let tailList = subList.map(item => [...r, item])
        subResult.push(...tailList)
      }
      result = subResult
    }
  }
  return result
}
function combination(list) {
  return list.reduce((result, subList) => {
    return subList.reduce((subResult, item) => {
      let tail = result.length ? result.map((l) => [...l, item]) : [[item]];
      return subResult.concat(tail);
    }, []);
  }, []);
}

最终实现:

function compose(list) {
  var res = list.reduce((result, property) => {
    return property.reduce((acc, value) => {
      return acc.concat(result.map((ele) => [].concat(ele, value)));
    }, []);
  });
  return res.map((arr) => arr.join("+"));
}
原文转自:https://fe.ecool.fun/topic/5652afd0-efdc-4f2d-a5e2-e4cc0669638a