几道算法...

211 阅读1分钟

创建一个函数,并返回具有匹配的名称和值对的所有对象的数组。 如果要包含在返回的数组中,则源对象的每个名称和值对都必须存在于集合中的对象中。

如:whatIsInAName([{ first: "Romeo", last: "Montague" }, { first: "Mercutio", last: null }, { first: "Tybalt", last: "Capulet" }], { last: "Capulet" })

应返回 [{ first: "Tybalt", last: "Capulet" }]

  function whatIsInAName(collection, source) {
  let b = Object.keys(source);
  let a =b.length;//这是b的长度
  let count=0;
  let c = [];
  for(let i=0;i<collection.length;i++){
      count=0;  //每项匹配度数都应重置为0,假如你的source的长度只有1,本来匹配一次就加入了c数组中,但如果不为0,collection后面的每项被+1,每项被匹配上时,但因为count已经为2或者递加上去,无法再加入c中
   for(let j=0;j<b.length;j++){
     if(collection[i].hasOwnProperty(b[j]) && collection[i][b[j]]==source[b[j]]){
      count++;   //这里是保证source每项都匹配上才被添加进数组
      console.log(count)
     }
     if(count==a){
       c.push(collection[i])
       continue; //结束本轮循环,进入下一轮循环中
     }
   }
  }

  console.log(c)
  return c;
}

比较两个数组并返回一个新数组,包含所有只在其中一个数组中出现的元素,排除两个数组都存在的元素。 换言之,我们需要返回两个数组的对称差。

[1, 2, 3, 5], [1, 2, 3, 4, 5] 应返回 [4]

  function diffArray(arr1, arr2) {
  let newArr = [];
  let arr = [...arr1,...arr2];
  let obj = new Map(); //用map的原因是map的key值key是任意值,传进去的值是什么就是什么,不会像object那样硬转为字符串,改变了原有数据类型
  for(let i=0;i<arr.length;i++){
    if(obj.has(arr[i])){
      obj.set(arr[i],obj.get(arr[i])+1)
    }else{
      obj.set(arr[i],1)
    }
  }
  console.log(obj)
  for(let [key,value] of obj){
    if(value==1){
      newArr.push(key)
    }
  }
  return newArr;
}

编写一个带有两个或更多数组的函数,并按原始提供的数组的顺序返回一个新的唯一值数组。换句话说,所有数组中出现的所有值都应按其原始顺序包括在内,但最终数组中不得重复。去重后的数字应按其出现在参数中的原始顺序排序,最终数组不应按数字大小进行排序。

如:uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]) 应返回 [1, 3, 2, 5, 4]``uniteUnique([1, 3, 2], [5, 2, 1, 4], [2, 1]) 应返回 [1, 3, 2, 5, 4]

  function uniteUnique(arr) {
  let len = arguments.length;
  let concatArr =[];
  let res=[];
  for(let i=0;i<len;i++){
    concatArr = concatArr.concat(arguments[i])
  }
  res = Array.from(new Set([...concatArr]))
  console.log(res)
  return res;
}

写一个函数,参数为一个正整数 num,返回值为斐波那契数列中,小于或等于 num 的奇数之和。

如:sumFibs(4) 应返回 5。

function sumFibs(num) {
  let start=0;
  let second=1;
  let sum = 1;
  let res=0;
  while(res<=num){
    res = start+second;
    start = second;
    second=res;
    if( res<=num && res % 2 != 0){ //这里多加重复判断是因为在循环体中,res可能比num大了,也会加入了sum的和中,res只有比num或者等于num的,才可以加入sum计算中
      sum+=res;
    }
  }
  return sum;
}

创建一个将两个参数相加的函数。 如果只提供了一个参数,则返回一个需要一个参数并返回总和的函数。

addTogether(23, 30) 应返回 53。addTogether(5)(7) 应返回 12。addTogether("http://bit.ly/IqT6zt") 应返回 undefinedaddTogether(2, "3") 应返回 undefined

function addTogether() {
  for(let i=0;i<arguments.length;i++){
    if(typeof arguments[i] != 'number'){
      return undefined;
    }
  }
  if(arguments.length>1){
    let arr = Array.from(arguments);
    return arr.reduce((v,e)=>{
      return v=v+e;
    },0)
  }else{
    return (y)=>{
       if(typeof y != 'number'){
        return undefined;
      }else{
        return y+arguments[0]}
      }
  }
}