判断是否是全组合 且无重复项

81 阅读1分钟

// 判断是不是全组合 且没有重复
const inputData = [
	{ 字段1: "甲", 字段2: "a", 字段3: 1 },
	{ 字段1: "甲", 字段2: "a", 字段3: 2 },
	{ 字段1: "甲", 字段2: "a", 字段3: 3 },
	{ 字段1: "甲", 字段2: "b", 字段3: 1 },
	{ 字段1: "甲", 字段2: "b", 字段3: 2 },
	{ 字段1: "甲", 字段2: "b", 字段3: 3 },
	{ 字段1: "乙", 字段2: "a", 字段3: 1 },
	{ 字段1: "乙", 字段2: "a", 字段3: 2 },
	{ 字段1: "乙", 字段2: "a", 字段3: 3 },
	{ 字段1: "乙", 字段2: "b", 字段3: 1 },
	{ 字段1: "乙", 字段2: "b", 字段3: 2 },
	{ 字段1: "乙", 字段2: "b", 字段3: 3 },
];

function isFullCombination(datas) {
	if (datas.length === 0) return false;
	const keys = Object.keys(datas[0]);
	const filedMap = new Map(keys.map((key) => [key, new Set()]));
	console.log({ keys, filedMap });
	const objSerialized = new Set(); // 定义一个唯一的对象序列化
	const valueMap = new Map(); // value值的映射关系 甲-1 乙-2 以此类推
	let n = 1;
	for (const data of datas) {
		let serialized = "";
		for (const key of keys) {
			const value = data[key];
			if (!valueMap.has(value)) {
                            valueMap.set(value, n++);
			}
			filedMap.get(key).add(value);
			serialized += "-" + valueMap.get(value);
		}

		// 如果有重复的 直接return false 终止循环
		if (objSerialized.has(serialized)) {
			return false;
		}

		console.log({ serialized });
	}
	console.log({ valueMap });

	console.log({ objSerialized });

	// console.log("values", [...filedMap.values()]);
	// 无重复的 才会走到这里 比较全组合的数量
	const n1 = [...filedMap.values()].reduce((pre, cur) => pre * cur.size, 1);
	const n2 = datas.length;
	console.log({ keys, filedMap, n1 });

	return n1 === n2;
}

console.log(isFullCombination(inputData));