亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

優化嵌套for循環算法,Javascript

優化嵌套for循環算法,Javascript

三國紛爭 2023-03-03 09:41:19
我正在使用 pokemon API 構建一個有趣的小信息應用程序。我特別想要一個部分詳細說明口袋妖怪的傷害關系。我目前檢索數據并將其格式化為:我想要做的是像這樣格式化它。DamageMap:  Map {  "double_damage_from" => Array [    "flying",    "poison",    "bug",    "fire",    "ice",    "ground",    "psychic",  ],  "double_damage_to" => Array [    "ground",    "rock",    "water",    "grass",    "fairy",  ],  "half_damage_from" => Array [    "ground",    "water",    "grass",    "electric",    "fighting",    "poison",    "bug",    "fairy",  ],  "half_damage_to" => Array [    "flying",    "poison",    "bug",    "steel",    "fire",    "grass",    "dragon",    "ground",    "rock",    "ghost",  ],  "no_damage_from" => Array [],  "no_damage_to" => Array [    "steel",  ],}數據被格式化到這個地圖中,沒有重復的類型。這是我目前的解決方案。const keys = [      "double_damage_from",      "double_damage_to",      "half_damage_from",      "half_damage_to",      "no_damage_from",      "no_damage_to",    ];    const damageMap = new Map();    for (let i = 0; i < results.length; ++i) {      for (let j = 0; j < keys.length; ++j) {        if (!damageMap.has(keys[j])) {          damageMap.set(keys[j], []);        }        const val = damageMap.get(keys[j]);        const curr = results[i][keys[j]];        for (let k = 0; k < curr.length; ++k) {          if (val.indexOf(curr[k].name) === -1) {            val.push(curr[k].name);          }        }        damageMap.set(keys[j], val);      }    }    return damageMap;  };這太殘忍了……我知道這一點。我的問題是迄今為止任何優化它的嘗試都失敗了。我曾嘗試使用map和reduce函數的組合,但無濟于事。如果有人可以看一下并優化它,將不勝感激!
查看完整描述

3 回答

?
SMILET

TA貢獻1796條經驗 獲得超4個贊

您可以Array.prototype.reduce()與一起使用Array.prototype.forEach()

const src = [{"double_damage_from":[{"name":"flying","url":"https://pokeapi.co/api/v2/type/3/",},{"name":"poison","url":"https://pokeapi.co/api/v2/type/4/",},{"name":"bug","url":"https://pokeapi.co/api/v2/type/7/",},{"name":"fire","url":"https://pokeapi.co/api/v2/type/10/",},{"name":"ice","url":"https://pokeapi.co/api/v2/type/15/",},],"double_damage_to":[{"name":"ground","url":"https://pokeapi.co/api/v2/type/5/",},{"name":"rock","url":"https://pokeapi.co/api/v2/type/6/",},{"name":"water","url":"https://pokeapi.co/api/v2/type/11/",},],"half_damage_from":[{"name":"ground","url":"https://pokeapi.co/api/v2/type/5/",},{"name":"water","url":"https://pokeapi.co/api/v2/type/11/",},{"name":"grass","url":"https://pokeapi.co/api/v2/type/12/",},{"name":"electric","url":"https://pokeapi.co/api/v2/type/13/",},],"half_damage_to":[{"name":"flying","url":"https://pokeapi.co/api/v2/type/3/",},{"name":"poison","url":"https://pokeapi.co/api/v2/type/4/",},{"name":"bug","url":"https://pokeapi.co/api/v2/type/7/",},{"name":"steel","url":"https://pokeapi.co/api/v2/type/9/",},{"name":"fire","url":"https://pokeapi.co/api/v2/type/10/",},{"name":"grass","url":"https://pokeapi.co/api/v2/type/12/",},{"name":"dragon","url":"https://pokeapi.co/api/v2/type/16/",},],"name":"grass","no_damage_from":[],"no_damage_to":[],},{"double_damage_from":[{"name":"ground","url":"https://pokeapi.co/api/v2/type/5/",},{"name":"psychic","url":"https://pokeapi.co/api/v2/type/14/",},],"double_damage_to":[{"name":"grass","url":"https://pokeapi.co/api/v2/type/12/",},{"name":"fairy","url":"https://pokeapi.co/api/v2/type/18/",},],"half_damage_from":[{"name":"fighting","url":"https://pokeapi.co/api/v2/type/2/",},{"name":"poison","url":"https://pokeapi.co/api/v2/type/4/",},{"name":"bug","url":"https://pokeapi.co/api/v2/type/7/",},{"name":"grass","url":"https://pokeapi.co/api/v2/type/12/",},{"name":"fairy","url":"https://pokeapi.co/api/v2/type/18/",},],"half_damage_to":[{"name":"poison","url":"https://pokeapi.co/api/v2/type/4/",},{"name":"ground","url":"https://pokeapi.co/api/v2/type/5/",},{"name":"rock","url":"https://pokeapi.co/api/v2/type/6/",},{"name":"ghost","url":"https://pokeapi.co/api/v2/type/8/",},],"name":"poison","no_damage_from":[],"no_damage_to":[{"name":"steel","url":"https://pokeapi.co/api/v2/type/9/",},],},],



    result = src.reduce((acc, o) => {

      Object.keys(o).forEach(key => {

        if(Array.isArray(o[key])){

          const match = acc.get(key),

                items = o[key].map(({name}) => name)

          match ? 

          match.push(...items) :

          acc.set(key, items)

        }

       }) 

      return acc

    }, new Map)

    

console.log(result)



查看完整回答
反對 回復 2023-03-03
?
慕森王

TA貢獻1777條經驗 獲得超3個贊

這行得通嗎?


我不知道從主數組中調用每個子元素是什么,values所以thing我使用的是什么。但這只是在那里挖掘并從每個子級別元素中提取名稱并將它們相加。


我不擔心唯一性,但你可以(在 concat 之后)添加一個 uniq 清理東西。


// where `values` is your initial data structure


const damageMap = values.reduce((memo, thing) => {

  Object.keys(thing).forEach(key => {

    if (key !== 'name') {

      memo[key] = memo[key] || []

      memo[key] = memo[key].concat(

        thing[key].map(({name}) => name))

    }

  })

  return memo

},{});


查看完整回答
反對 回復 2023-03-03
?
暮色呼如

TA貢獻1853條經驗 獲得超9個贊

使用Array.reduce收集數據,使用Array#forEach遍歷元素,使用Object.entries從對象中獲取鍵/值。

let map = arr.reduce((acc, cur) => {

   Object.entries(cur).forEach(([key, values]) => {

       if (!acc[key] && key !=='name') {

           acc[key] = [];

       }

       if (typeof(values)=== 'object') {

           values.forEach(({name}) => {

               acc[key].push(name);

           });

       }

   });

   return acc;

}, {});

在這里玩 around https://jsfiddle.net/h8kL5gp9/或試試這個(用洞代碼):


let arr = [

   {

    "double_damage_from": [

      {

        "name": "flying",

        "url": "https://pokeapi.co/api/v2/type/3/",

      },

      {

        "name": "poison",

        "url": "https://pokeapi.co/api/v2/type/4/",

      },

      {

        "name": "bug",

        "url": "https://pokeapi.co/api/v2/type/7/",

      },

      {

        "name": "fire",

        "url": "https://pokeapi.co/api/v2/type/10/",

      },

      {

        "name": "ice",

        "url": "https://pokeapi.co/api/v2/type/15/",

      },

    ],

    "double_damage_to": [

      {

        "name": "ground",

        "url": "https://pokeapi.co/api/v2/type/5/",

      },

      {

        "name": "rock",

        "url": "https://pokeapi.co/api/v2/type/6/",

      },

      {

        "name": "water",

        "url": "https://pokeapi.co/api/v2/type/11/",

      },

    ],

    "half_damage_from": [

      {

        "name": "ground",

        "url": "https://pokeapi.co/api/v2/type/5/",

      },

      {

        "name": "water",

        "url": "https://pokeapi.co/api/v2/type/11/",

      },

      {

        "name": "grass",

        "url": "https://pokeapi.co/api/v2/type/12/",

      },

      {

        "name": "electric",

        "url": "https://pokeapi.co/api/v2/type/13/",

      },

    ],

    "half_damage_to": [

      {

        "name": "flying",

        "url": "https://pokeapi.co/api/v2/type/3/",

      },

      {

        "name": "poison",

        "url": "https://pokeapi.co/api/v2/type/4/",

      },

      {

        "name": "bug",

        "url": "https://pokeapi.co/api/v2/type/7/",

      },

      {

        "name": "steel",

        "url": "https://pokeapi.co/api/v2/type/9/",

      },

      {

        "name": "fire",

        "url": "https://pokeapi.co/api/v2/type/10/",

      },

      {

        "name": "grass",

        "url": "https://pokeapi.co/api/v2/type/12/",

      },

      {

        "name": "dragon",

        "url": "https://pokeapi.co/api/v2/type/16/",

      },

    ],

    "name": "grass",

    "no_damage_from": [],

    "no_damage_to": [],

  },

  {

    "double_damage_from": [

      {

        "name": "ground",

        "url": "https://pokeapi.co/api/v2/type/5/",

      },

      {

        "name": "psychic",

        "url": "https://pokeapi.co/api/v2/type/14/",

      },

    ],

    "double_damage_to": [

      {

        "name": "grass",

        "url": "https://pokeapi.co/api/v2/type/12/",

      },

      {

        "name": "fairy",

        "url": "https://pokeapi.co/api/v2/type/18/",

      },

    ],

    "half_damage_from": [

      {

        "name": "fighting",

        "url": "https://pokeapi.co/api/v2/type/2/",

      },

      {

        "name": "poison",

        "url": "https://pokeapi.co/api/v2/type/4/",

      },

      {

        "name": "bug",

        "url": "https://pokeapi.co/api/v2/type/7/",

      },

      {

        "name": "grass",

        "url": "https://pokeapi.co/api/v2/type/12/",

      },

      {

        "name": "fairy",

        "url": "https://pokeapi.co/api/v2/type/18/",

      },

    ],

    "half_damage_to": [

      {

        "name": "poison",

        "url": "https://pokeapi.co/api/v2/type/4/",

      },

      {

        "name": "ground",

        "url": "https://pokeapi.co/api/v2/type/5/",

      },

      {

        "name": "rock",

        "url": "https://pokeapi.co/api/v2/type/6/",

      },

      {

        "name": "ghost",

        "url": "https://pokeapi.co/api/v2/type/8/",

      },

    ],

    "name": "poison",

    "no_damage_from": [],

    "no_damage_to": [

      {

        "name": "steel",

        "url": "https://pokeapi.co/api/v2/type/9/",

      },

    ],

  },

];


let map = arr.reduce((acc, cur) => {

   Object.entries(cur).forEach(([key, values]) => {

       if (!acc[key] && key !=='name') {

           acc[key] = [];

       }

       if (typeof(values)=== 'object') {

           values.forEach(({name}) => {

               acc[key].push(name);

           });

       }

   });

   return acc;

}, {});


console.log(map);


查看完整回答
反對 回復 2023-03-03
  • 3 回答
  • 0 關注
  • 167 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號