如何在javascript中对不同的键进行分组?

问题描述 投票:1回答:1

我有一个对象数组,键是页面和链接,我希望最终结果按链接将页面分组。

我的代码是:

  let Test =[
    {page:'getting link 1', lien:['lienPage1HTTP_404V']}, 
    {page:'getting link 2', lien:['lienPage2HTTP_404V1']},
    {page:'getting link 3', lien:['lienPage3HTTP_404V3','lienPage3HTTP_404V']},
    {page:'getting link 4', lien:['lienPage4HTTP_404V4']},
  ];

  var sorted = {};
  var Last1 =[];
  var Last2 =[];

  for( var i = 0; i< Test.length;  i++ ){
    if(Test[i].lien.length>1){
      for(let k=0; k<Test[i].lien.length; k++){
        Last1.push(({lien:Test[i].lien[k], page: Test[i].page}))
      }
    } 
    else {
      Last2.push(Test[i])
    }
  }
  var Last = Last1.concat(Last2);
  for( var i = 0; i< Last.length;  i++ ){
    if( sorted[Last[i].lien] == undefined ){
      sorted[Last[i].lien] = [];
    }
    sorted[Last[i].lien].push(Last[i].page)
  }

当我尝试管理sorted时,我得到了:

[object Object] {
  lienPage1HTTP_404V: ["getting link 1"],
  lienPage2HTTP_404V1: ["getting link 2"],
  lienPage3HTTP_404V: ["getting link 3"],
  lienPage3HTTP_404V3: ["getting link 3"],
  lienPage4HTTP_404V4: ["getting link 4"]
}

但是我希望最终结果将是:

[object Object] {
  lienPage1HTTP_404V: ["getting link 1", "getting link 3"],
  lienPage2HTTP_404V1: ["getting link 2"],
  lienPage3HTTP_404V3: ["getting link 3"],
  lienPage4HTTP_404V4: ["getting link 4"]
}

对于每个相同的键,我们都有他的值的数组。

我该如何解决?

javascript arrays object group-by key
1个回答
0
投票

您只能使用lien的一部分字符串,而仅将HTTP_404V'分组到一个临时对象中。

var data = [{ page: 'getting link 1', lien: ['lienPage1HTTP_404V'] }, { page: 'getting link 2', lien: ['lienPage2HTTP_404V1'] }, { page: 'getting link 3', lien: ['lienPage3HTTP_404V3', 'lienPage3HTTP_404V'] }, { page: 'getting link 4', lien: ['lienPage4HTTP_404V4'] }],
    reference = {},
    grouped = {};

for (let { page, lien } of data) {
    for (let k of lien) {
        let key = k.slice(9); // or whatever is suitable for real data
        if (!reference[key]) {
            reference[key] = [];
            grouped[k] = reference[key];
        }
        reference[key].push(page);
    }
}

console.log(grouped);
.as-console-wrapper { max-height: 100% !important; top: 0; }
© www.soinside.com 2019 - 2024. All rights reserved.