Как добавить суммированный список в рекурсивный метод? - PullRequest
0 голосов
/ 15 октября 2018

Я ищу рекурсивный метод javascript. У меня есть эта структура, и я хочу иметь userlist в каждом разделе ..

let sectionObject=
{
  anotherSection1: {
    section1:{
      userlist:[ {name:"user1", val:1},{name:"user2", val:1}]
    },
    section2:{
      userlist:[ {name:"user1", val:1}]
    }
 },
  anotherSection2: {
    section1:{
      userlist:[ {name:"user1", val:5},{name:"user2", val:3}]
    },
    section2:{
      userlist:[ {name:"user1", val:6}]
    }
  }
}

, например, anotherSection должен иметь userlist тоже.В этом списке пользователей значения childelements суммируются.anotherSection имеет два дочерних элемента .. section1 и section2 .. anotherSection.userlist, следовательно, должно быть:

anotherSection.userlist: [{name: "user1", val: 2}, {name: "user2", val: 1}] (значение user1 дочерних элементов было добавлено вместе) .. sectionObject тоже должно иметь userlist. Я ценю любую помощь:)

Это должно быть результатом:

  let sectionObject=
{
  anotherSection1: {
    section1:{
      userlist:[ {name:"user1", val:1},{name:"user2", val:1}]
    },
    section2:{
      userlist:[ {name:"user1", val:1}]
    },
    userlist:[ {name:"user1", val:2},{name:"user2", val:1}]
  },
  anotherSection2: {
    section1:{
      userlist:[ {name:"user1", val:5},{name:"user2", val:3}]
    },
    section2:{
      userlist:[ {name:"user1", val:6}]
    },
    userlist:[ {name:"user1", val:11}, {name:"user2", val:3}]
  },
  userlist:[ {name:"user1", val:13}, {name:"user2", val:4}]
}

то, что я пробовал, выглядит примерно так ...

function somefunc(obj){
    temp = {}
    let tempuserliste = [];
    for (var key in obj) {
        if (obj.hasOwnProperty(key)) {
        obj[key].userlist.forEach(function(element) {
          if (typeof temp[element.name] === 'undefined'){
            temp[element.name] = {'name':element.name, 'val':element.val}
            tempuserlist.push(temp[element.name])
          } else {
            temp[element.name].val += element.val
          }
        });
      }
    }
    return tempuserlist;
  }

  sectionObject.anotherSection1.usertlist = somefunc(anotherSection1)

somefunc () хорошо работает на одном anothersection .. но я нене знаю, как объединить это рекурсивным методом ...

1 Ответ

0 голосов
/ 15 октября 2018

Чтобы сделать функцию рекурсивной, просто заставьте ее вызывать себя для дочерних объектов, если у них еще нет свойства userlist, и вместо возврата tempuserlist в конце, она должна просто присвоить ее непосредственно объекту.obj:

// ...
for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        if(!obj[key].hasOwnProperty("userlist")) {
            somefunc(obj[key]);
        }
// ...
obj.userlist = tempuserlist;

Демонстрация:

function somefunc(obj) {
   let temp = {};  // this shouldn't be global (undeclared thus global) or you'll have some very serious problems with the recursion
   let tempuserlist = [];
   for (var key in obj) {
      if (obj.hasOwnProperty(key)) {
         if(!obj[key].hasOwnProperty("userlist")) {
            somefunc(obj[key]);
         }
         obj[key].userlist.forEach(function(element) {
            if (!temp.hasOwnProperty(element.name)){
               tempuserlist.push(
                  temp[element.name] = { name: element.name, val: element.val }
               );
            } else {
               temp[element.name].val += element.val;
            }
         });
      }
   }
   obj.userlist = tempuserlist;
}

let sectionObject = {"anotherSection1":{"section1":{"userlist":[{"name":"user1","val":1},{"name":"user2","val":1}]},"section2":{"userlist":[{"name":"user1","val":1}]}},"anotherSection2":{"section1":{"userlist":[{"name":"user1","val":5},{"name":"user2","val":3}]},"section2":{"userlist":[{"name":"user1","val":6}]}}};

somefunc(sectionObject);

console.log(sectionObject);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...