鴻蒙應(yīng)用示例:NEXT 中 Map 類型的使用及注意事項

在JavaScript中,Map對象允許存儲任何類型的鍵和值,提供了鍵值對的存儲功能晒奕。在HarmonyOS中绪氛,Map的使用基本遵循JavaScript的標(biāo)準(zhǔn)唆鸡,尤其是要注意set賦值只能用get獲取,而索引賦值只能用索引獲取枣察。且它們可以同時賦值但遍歷的方式又不同争占。

【Map 對象的賦值與獲取】

  1. 使用set方法賦值
    當(dāng)你需要創(chuàng)建一個Map對象并為其設(shè)置初始值時燃逻,可以使用new Map()構(gòu)造函數(shù),并傳入一個由鍵值對組成的數(shù)組燃乍。一旦通過set方法設(shè)置了值唆樊,那么必須使用get方法來檢索這些值。
let p: Map<string, string> = new Map([["mobile", "13444444444"]]);
p.set('aaa', '111');
console.info(`p.get('mobile'):` + p.get('mobile'));
console.info(`p.get('aaa'):` + p.get('aaa'));
  1. 使用Object.entries轉(zhuǎn)換為Map
    如果你有一個對象刻蟹,并希望將其轉(zhuǎn)換為Map對象逗旁,可以利用Object.entries方法來實現(xiàn)這一點。此方法將對象的所有可枚舉屬性轉(zhuǎn)換成鍵值對數(shù)組舆瘪,然后可以用這些數(shù)組來初始化Map片效。
let strParam = '{"main":"aasadada","ks":"sadadas","sc":11111,"update":"asdasdasda"}';
let obj: object = JSON.parse(strParam);
let p2: Map<string, string | number> = new Map(Object.entries(obj));
console.info(`p2.get('main'): ${p2.get('main')}`);
  1. 使用索引賦值
    當(dāng)處理從接口API返回的數(shù)據(jù)時,可能需要將JSON字符串直接解析為Map英古。需要注意的是淀衣,雖然可以這樣做,但是當(dāng)嘗試通過索引訪問時召调,必須確保數(shù)據(jù)類型正確膨桥。
let jsonStr2 = `{"mobile2":"哈哈哈"}`;
let p3 = JSON.parse(jsonStr2) as Map<string, Object>;
console.info(`p3['mobile2']:${p3['mobile2']}`);

【Map 的遍歷】
Map對象支持多種遍歷方式,這取決于你是如何賦值的唠叛。

  1. 使用forEach遍歷
    對于通過set方法賦值的Map只嚣,推薦使用forEach來進行遍歷。
p.forEach((value, key) => {
  console.info(`Key (set): ${key}, Value (set): ${value}`);
});
  1. 使用索引遍歷
    如果Map是通過索引賦值的艺沼,則應(yīng)使用Object.keys結(jié)合forEach來遍歷鍵值對册舞。
Object.keys(targetMap).forEach((key) => {
  console.info(`Key (index): ${key}, Value (index): ${targetMap[key]}`);
});

【完整示例】

@Entry
@Component
struct Index {
  build() {
    Column() {
      Button('測試')
        .onClick(() => {
          let p1: Map<string, string> = new Map([["mobile", "13444444444"]]);
          p1.set('aaa', '111');
          console.info(`p1.get('mobile'):` + p1.get('mobile'));
          console.info(`p1.get('aaa'):` + p1.get('aaa'));

          let strParam = '{"main":"aasadada","ks":"sadadas","sc":11111,"update":"asdasdasda"}';
          let obj: object = JSON.parse(strParam);
          let p2: Map<string, string | number> = new Map(Object.entries(obj));
          console.info(`p2.get('main'): ${p2.get('main')}`);

          let jsonStr2 = `{"mobile2":"哈哈哈"}`
          let p3 = JSON.parse(jsonStr2) as Map<string, Object>
          console.info(`p3['mobile2']:${p3['mobile2']}`)

          console.info(`遍歷p1 forEach`)
          p1.forEach((value, key) => {
            console.info(`Key (set): ${key}, Value (set): ${value}`);
          });

          console.info(`遍歷p2 forEach`)
          p2.forEach((value, key) => {
            console.info(`Key (set): ${key}, Value (set): ${value}`);
          });

          console.info(`遍歷p3 forEach`)
          try {
            p3.forEach((value, key) => {
              console.info(`Key (set): ${key}, Value (set): ${value}`);
            });
          } catch (e) {
            console.error(`e:${JSON.stringify(e)}`)
          }

          console.info(`遍歷p1 Object.keys`)
          Object.keys(p1).forEach((key) => {
            console.info(`Key (index): ${key}, Value (index): ${p1[key]}`);
          });

          console.info(`遍歷p2 Object.keys`)
          Object.keys(p2).forEach((key) => {
            console.info(`Key (index): ${key}, Value (index): ${p2[key]}`);
          });

          console.info(`遍歷p3 Object.keys`)
          Object.keys(p3).forEach((key) => {
            console.info(`Key (index): ${key}, Value (index): ${p3[key]}`);
          });

        })
    }
    .height('100%')
    .width('100%')
  }
}

打印

p1.get('mobile'):13444444444
p1.get('aaa'):111
p2.get('main'): aasadada
p3['mobile2']:哈哈哈
遍歷p1 forEach
Key (set): mobile, Value (set): 13444444444
Key (set): aaa, Value (set): 111
遍歷p2 forEach
Key (set): main, Value (set): aasadada
Key (set): ks, Value (set): sadadas
Key (set): sc, Value (set): 11111
Key (set): update, Value (set): asdasdasda
遍歷p3 forEach
e:{}
遍歷p1 Object.keys
遍歷p2 Object.keys
遍歷p3 Object.keys
Key (index): mobile2, Value (index): 哈哈哈

注意事項
? 類型一致性:確保在使用Map時,鍵和值的類型保持一致障般。
? 遍歷方式:根據(jù)賦值方式選擇正確的遍歷方法调鲸。
? 錯誤處理:在嘗試遍歷非Map類型時,應(yīng)適當(dāng)處理可能出現(xiàn)的異常挽荡。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末藐石,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子徐伐,更是在濱河造成了極大的恐慌贯钩,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,406評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件办素,死亡現(xiàn)場離奇詭異角雷,居然都是意外死亡,警方通過查閱死者的電腦和手機性穿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,732評論 3 393
  • 文/潘曉璐 我一進店門勺三,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人需曾,你說我怎么就攤上這事吗坚∑碓叮” “怎么了?”我有些...
    開封第一講書人閱讀 163,711評論 0 353
  • 文/不壞的土叔 我叫張陵商源,是天一觀的道長车份。 經(jīng)常有香客問我,道長牡彻,這世上最難降的妖魔是什么扫沼? 我笑而不...
    開封第一講書人閱讀 58,380評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮庄吼,結(jié)果婚禮上缎除,老公的妹妹穿的比我還像新娘。我一直安慰自己总寻,他們只是感情好器罐,可當(dāng)我...
    茶點故事閱讀 67,432評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著渐行,像睡著了一般轰坊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祟印,一...
    開封第一講書人閱讀 51,301評論 1 301
  • 那天衰倦,我揣著相機與錄音,去河邊找鬼旁理。 笑死,一個胖子當(dāng)著我的面吹牛我磁,可吹牛的內(nèi)容都是我干的孽文。 我是一名探鬼主播,決...
    沈念sama閱讀 40,145評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼夺艰,長吁一口氣:“原來是場噩夢啊……” “哼芋哭!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起郁副,我...
    開封第一講書人閱讀 39,008評論 0 276
  • 序言:老撾萬榮一對情侶失蹤减牺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后存谎,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體拔疚,經(jīng)...
    沈念sama閱讀 45,443評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,649評論 3 334
  • 正文 我和宋清朗相戀三年既荚,在試婚紗的時候發(fā)現(xiàn)自己被綠了稚失。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,795評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡恰聘,死狀恐怖句各,靈堂內(nèi)的尸體忽然破棺而出吸占,到底是詐尸還是另有隱情,我是刑警寧澤凿宾,帶...
    沈念sama閱讀 35,501評論 5 345
  • 正文 年R本政府宣布矾屯,位于F島的核電站,受9級特大地震影響初厚,放射性物質(zhì)發(fā)生泄漏件蚕。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,119評論 3 328
  • 文/蒙蒙 一惧所、第九天 我趴在偏房一處隱蔽的房頂上張望骤坐。 院中可真熱鬧,春花似錦下愈、人聲如沸纽绍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,731評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽拌夏。三九已至,卻和暖如春履因,著一層夾襖步出監(jiān)牢的瞬間障簿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,865評論 1 269
  • 我被黑心中介騙來泰國打工栅迄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留站故,地道東北人。 一個月前我還...
    沈念sama閱讀 47,899評論 2 370
  • 正文 我出身青樓毅舆,卻偏偏與公主長得像西篓,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子憋活,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,724評論 2 354

推薦閱讀更多精彩內(nèi)容