Skip to content

每日一题 - 数据格式转化问题

信息卡片

  • 时间:2019-08-05
  • tag:格式 对象

题目描述

已知数据格式:

js
const userToSkill = {
    robert: ["programming", "design", "reactjs"],
    kimia: ["java", "backend", "services"],
    patrick: ["reactjs"],
    chris: ["reactjs", "programming"]
  };
const userToSkill = {
    robert: ["programming", "design", "reactjs"],
    kimia: ["java", "backend", "services"],
    patrick: ["reactjs"],
    chris: ["reactjs", "programming"]
  };

转化成

js
const skillToUser = {
    programming: ["robert", "chris"],
    reactjs: ["patrick", "robert", "chris"],
    java: ["kimia"],
    backend: ["kimia"],
    services: ["kimia"],
    design: ["robert"]
  };
const skillToUser = {
    programming: ["robert", "chris"],
    reactjs: ["patrick", "robert", "chris"],
    java: ["kimia"],
    backend: ["kimia"],
    services: ["kimia"],
    design: ["robert"]
  };

扩展:

完成函数:

js
function setOfUsersWithSimillarSkills(userToSkill) {

}
function setOfUsersWithSimillarSkills(userToSkill) {

}

期望输出: ["robert", "chris"]

参考代码

方案一:

js
function transform(userToSkill) {
  const skillToUser = {};
  for (const k in userToSkill) {
    userToSkill[k].forEach(skill => {
      if (skillToUser[skill] === void 0) {
        skillToUser[skill] = [k];
      } else {
        skillToUser[skill].push(k);
      }
    });
  }

  return skillToUser;
}
function transform(userToSkill) {
  const skillToUser = {};
  for (const k in userToSkill) {
    userToSkill[k].forEach(skill => {
      if (skillToUser[skill] === void 0) {
        skillToUser[skill] = [k];
      } else {
        skillToUser[skill].push(k);
      }
    });
  }

  return skillToUser;
}

方案二:

js
const transform = userToSkill =>
  Object.entries(userToSkill).reduce((skillToUser, [user, skills]) =>
    skills.reduce((skillToUser, skill) =>({
      ...skillToUser,
      [skill]: skillToUser[skill] ? skillToUser[skill].concat(user) : [skill]
    }), skillToUser), {})
const transform = userToSkill =>
  Object.entries(userToSkill).reduce((skillToUser, [user, skills]) =>
    skills.reduce((skillToUser, skill) =>({
      ...skillToUser,
      [skill]: skillToUser[skill] ? skillToUser[skill].concat(user) : [skill]
    }), skillToUser), {})

扩展:

js
function backtrack(list, tempList, nums, start) {
  list.push(intersect(...tempList));
  for(let i = start; i < nums.length; i++) {
      tempList.push(nums[i]);
      backtrack(list, tempList, nums, i + 1);
      tempList.pop();
  }
}
/**
* @param {number[]} nums
* @return {number[][]}
*/
function subsets(nums) {
  const list = [];
  backtrack(list, [], nums, 0);
  return list;
};

function intersect(arr1, ...rest) {
  const set = new Set();
  if (rest.length === 0) return set;
  const s1 = new Set(arr1);
  const restSet = rest.map(a => new Set(a));
  for (const x of s1) {
    if (restSet.every(s => s.has(x))) {
      set.add(x);
    }
  }
  return set;
}
function maxByLength(list) {
  let max = 0;
  let maxIndex = 0;

  for(let i = 0; i < list.length; i++) {
    if (list.length > max) {
      max = list.length;
      maxIndex = i;
    }
  }
  return list[maxIndex];
}

function setOfUsersWithSimillarSkills(userToSkill) {
  const mapper = transform(userToSkill);
  const sets = subsets(Object.values(mapper).filter(q => q.length > 1));
  const list = sets.map(set => Array.from(set)).filter(q => q.length);
  return maxByLength(list)
}
function backtrack(list, tempList, nums, start) {
  list.push(intersect(...tempList));
  for(let i = start; i < nums.length; i++) {
      tempList.push(nums[i]);
      backtrack(list, tempList, nums, i + 1);
      tempList.pop();
  }
}
/**
* @param {number[]} nums
* @return {number[][]}
*/
function subsets(nums) {
  const list = [];
  backtrack(list, [], nums, 0);
  return list;
};

function intersect(arr1, ...rest) {
  const set = new Set();
  if (rest.length === 0) return set;
  const s1 = new Set(arr1);
  const restSet = rest.map(a => new Set(a));
  for (const x of s1) {
    if (restSet.every(s => s.has(x))) {
      set.add(x);
    }
  }
  return set;
}
function maxByLength(list) {
  let max = 0;
  let maxIndex = 0;

  for(let i = 0; i < list.length; i++) {
    if (list.length > max) {
      max = list.length;
      maxIndex = i;
    }
  }
  return list[maxIndex];
}

function setOfUsersWithSimillarSkills(userToSkill) {
  const mapper = transform(userToSkill);
  const sets = subsets(Object.values(mapper).filter(q => q.length > 1));
  const list = sets.map(set => Array.from(set)).filter(q => q.length);
  return maxByLength(list)
}