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

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

如何將特定鍵合并到另一個對象關于公共鍵?

如何將特定鍵合并到另一個對象關于公共鍵?

慕神8447489 2022-11-03 10:00:01
我有一個有很多記錄的數組。需要根據條件合并對象(不適用于數組內所有可用的對象),這種情況下首先需要將數據與名稱進行比較。第 1 步:需要在數組中查找具有相似名稱的對象。步驟2:如果我們有相同的數據,接下來比較匹配數據中的狀態鍵。步驟3:case1:如果匹配數據中的任何一個對象的狀態為true(設置狀態:true),則需要合并該對象的所有喜好鍵。 case2:如果匹配數據中的所有對象的狀態都為false,則(設置狀態:false)需要將所有喜歡的鍵合并到任何對象。如何做到這一點?大批[  {    name: 'jane',    age: 10,    status: true,    likings: [{ sports: 'football', books: 'harrypotter' }],  },  {    name: 'sam',    age: 20,    status: false,    likings: [{ sports: 'basketball', books: 'book1' }],  },  {    name: 'jane',    age: 10,    status: false,    likings: [{ sports: 'chess', books: 'book2' }],  },  {    name: 'robert',    age: 40,    status: false,    likings: [{ sports: 'carrom', books: 'book3' }],  },  {    name: 'jane',    age: 10,    status: false,    likings: [{ sports: 'gaming', books: 'book4' }],  },];預期 o/p[  {    name: 'jane',    age: 10,    status: true,    likings: [      { sports: 'football', books: 'harrypotter' },      { sports: 'gaming', books: 'book4' },      { sports: 'chess', books: 'book2' },    ],  },  {    name: 'sam',    age: 20,    status: false,    likings: [{ sports: 'basketball', books: 'book1' }],  },  {    name: 'robert',    age: 40,    status: false,    likings: [{ sports: 'carrom', books: 'book3' }],  },];
查看完整描述

2 回答

?
藍山帝景

TA貢獻1843條經驗 獲得超7個贊

您可以使用.reduce()將所有具有相同名稱的對象合并到一個Map. 這可以通過保留name具有該名稱的對象的鍵和值的映射。每當您在數組中遇到新對象時,您都可以檢查它是否存在于地圖中。如果是這樣,您可以添加到likings存儲在關聯對象中的數組中。true如果當前對象為,您還可以將狀態更新為true。如果映射中不存在對象的名稱作為鍵,您可以將對象添加為值,進一步的后續迭代reduce可以合并到該值中。


請參見下面的示例:


const arr = [ { name: 'jane', age: 10, status: true, likings: [{ sports: 'football', books: 'harrypotter' }], }, { name: 'sam', age: 20, status: false, likings: [{ sports: 'basketball', books: 'book1' }], }, { name: 'jane', age: 10, status: false, likings: [{ sports: 'chess', books: 'book2' }], }, { name: 'robert', age: 40, status: false, likings: [{ sports: 'carrom', books: 'book3' }], }, { name: 'jane', age: 10, status: false, likings: [{ sports: 'gaming', books: 'book4' }], }, { name: 'sam', age: 10, status: false, likings: [{ sports: 'gaming', books: 'book5' }], }];


const merged = [...arr.reduce((m, o) => {

  const curr = m.get(o.name) || {};

  return m.set(o.name, {...o, status: curr.status || o.status, likings: [...(curr && curr.likings || []), ...o.likings]});

}, new Map).values()]


console.log(merged);


查看完整回答
反對 回復 2022-11-03
?
烙印99

TA貢獻1829條經驗 獲得超13個贊

我認為我沒有完全理解您的要求,尤其是關于“相似名稱”的要求。因此,我假設您要根據“名稱”對記錄進行分組,并且所有具有相同“名稱”的記錄都將具有相同的“年齡”。


下面的解決方案是使用一個對象對記錄進行分組,hash并繼續將它們連接likings到元素中。完成后,通過調用返回對象的所有元素,Object.values()應該保持名稱出現的順序。


這是你想要的,或者至少給你一些想法?希望能幫助到你。


function merge(records) {

  const hash = {};


  for (let i = 0; i < records.length; i++) {

    const element = records[i];

    const key = element.name; // if you want to do something for "similarity", do something here.


    hash[key] = {

      ...element,

      status: (hash[key] && hash[key].status) || element.status,

      likings: element.likings.concat((hash[key] && hash[key].likings) || []),

    };

  }


  return Object.values(hash);

}


const data = [

  {

    name: "jane",

    age: 10,

    status: true,

    likings: [{ sports: "football", books: "harrypotter" }],

  },

  {

    name: "sam",

    age: 20,

    status: false,

    likings: [{ sports: "basketball", books: "book1" }],

  },

  {

    name: "jane",

    age: 10,

    status: false,

    likings: [{ sports: "chess", books: "book2" }],

  },

  {

    name: "robert",

    age: 40,

    status: false,

    likings: [{ sports: "carrom", books: "book3" }],

  },

  {

    name: "jane",

    age: 10,

    status: false,

    likings: [{ sports: "gaming", books: "book4" }],

  },

];


console.log(merge(data));


查看完整回答
反對 回復 2022-11-03
  • 2 回答
  • 0 關注
  • 109 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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