Как сгруппировать разные ключи в javascript? - PullRequest
2 голосов
/ 27 января 2020

У меня есть массив объектов, ключами которых являются страница и ссылка, я хочу, чтобы конечный результат сгруппировал страницу по ссылкам.

Мой код:

  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"]
}

Для каждого того же ключа у нас есть массив его значение.

Как это исправить?

Ответы [ 4 ]

2 голосов
/ 27 января 2020

Вы можете взять только часть строк 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.match(/HTTP_404.*/)[0];
        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; }
1 голос
/ 27 января 2020

Это может помочь:

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 data={};

  Test.map(el=>{
      el.lien.map(dt=>{
          data[dt]=data[dt]?[...data[dt],el.page]:[el.page]
      })
  })
  console.log(data)
1 голос
/ 27 января 2020
var newAr = []
Test.forEach((a,b)=>{newAr.push(a.lien)})
console.log(newAr.filter((a, b) => newAr.indexOf(a) === b))
//["lienPage1HTTP_404V,lienPage2HTTP_404V1,lienPage3HTTP_404V3,lienPage3HTTP_404V,lienPage4HTTP_404V4"]

// Использовать этот уникальный массив и l oop через тестовый объект

Использовать Map of Object и l oop через newAr и добавлять к объекту согласно требованию.

1 голос
/ 27 января 2020

Вы можете заменить ненужную часть текста и работать с оставшейся частью. Кроме того, вы должны сохранить указатели сгруппированных значений.

let arr =[{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']}],
    result = arr.reduce((a, {page, lien}) => {
      lien.forEach(e => {
        let extractedPart = e.replace(/lienPage[0-9]+/, "");
        a.pointers[extractedPart] = a.pointers[extractedPart] || e;
        (a.group[a.pointers[extractedPart]] || (a.group[a.pointers[extractedPart]] = [])).push(page);
      });
      return a;
    }, {pointers: {}, group: {}}).group;

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
...