The World of Remnant

TS任务pluck

原作者是浅提取 提取所有深度的目标属性

var pokemon = [{a:[[{name: ['pikachu','kittydog']}, [{name: 'meowth'}]], {name: 'mr mime'}]}]
console.log(pluck('name',pokemon));

function pluck(keyword:string|number,target:Record<string|number,any>) {
  function extract(keyword:string|number,target:any) {
    let result:any[] = []
    if (typeof target === 'object'){
      if (target instanceof Array){
        for (let item of target) {
          result.push(extract(keyword,item))
        }
      }else if(target===null){}else{
        if(target[keyword] !==  undefined){
          result.push(target[keyword])
        }
        for (var keys in target) {
          result.push(extract(keyword,target[keys]))
        }
      }
    }
    return result
  }
  function flater(arr:any[]):any[] {    // 手写flat
    // [[[[[["pikachu","kittydog"],[[],[]]],[["meowth",[]]]],["mr mime",[]]]]] => ['pikachu', 'kittydog', 'meowth', 'mr mime']
    let result = []
    for (let item of arr) {
      if (typeof item === 'object'){
        result = flater(result.concat(item))   // 写出来了我却看不懂了??
      }else{
        result.push(item)
      }
    }
    return result
  }
  return flater(extract(keyword,target))
  // return (<any>extract(keyword,target)).flat(Infinity)   // flat
}