удалить вложенные циклы foreach - PullRequest
0 голосов
/ 21 сентября 2018

В моем коде я использовал два цикла forEach.Но чтобы оптимизировать мой код, я получил указание не использовать цикл forEach внутри цикла forEach.Поэтому я не хочу перебирать второй массив obj3.Я просто хочу получить значения в определенной позиции, не используя внутренний цикл forEach.Вот мой код: -

var obj2 = [{
  "name": "4134",
  "calls": [

  ]
}]

    var obj3 = [{ Channel: 'SIP/4134-0004462a',
        State: 'Up',
        Accountcode: '7013658596'},
      { Channel: 'SIP/4334-sa',
        State: 'Up',
        Accountcode: '07717754702',
      }]


var function = (obj2, obj3) => {
    obj2.forEach((a) =>
      obj3.forEach((b) => {
        if (b.Channel.includes(a.name)) a.calls = (a.calls || []).concat(Object.assign({}, { MobileNo: b.Accountcode, Status : b.State}));

      })
    );
};

function(obj2, obj3);

Приведенный выше код перебирает obj2 и obj3, и если значение ключа имени существует в значении ключа канала, то он выбирает код учетной записи и состояние из obj3 и выталкивает их вмассив вызовов объекта obj2.Вот выходной массив: -

    [ {
  "name": "4134",
  "calls": [
    {
      "MobileNo": "7013658596",
      "Status": "Up"
    }
  ]
}]

Что я сделал до сих пор

var func = (obj2, obj3) => {

var channelArr = [];
const Channels = obj3.reduce((acc, curVal) => {
  obj2.forEach((item)=>{
    if(curVal.Channel.includes(item.name)){
      item.calls.push({'MobileNo':curVal.Accountcode,'Status': curVal.State})
    }
  })
  return obj2;
}, [])

};

Я пытался сделать это, используя функцию Reduce, но на самом деле я неуверен, если это может улучшить производительность.Пожалуйста, дайте мне знать, если у вас есть лучшие предложения.

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Я пытался использовать filter и map, проверьте, работает ли это для вас.

const result = obj2.map(a => {
  const foundAll = obj3.filter(
    ({ Channel, Accountcode, State }) =>
      Channel.includes(a.name) && { Accountcode, State }
  );
  return {
    name: a.name,
    calls: [...a.calls, foundAll]
  };
});
console.info(result);

Найдите работу Корзина здесь .

0 голосов
/ 21 сентября 2018

Надеюсь, это поможет.Я создал таблицу соответствия как структуру с помощью obj3.и после этого при обходе obj2 просто проверяет, присутствует ли имя в таблице поиска или нет, и, если присутствует, назначает некоторый объект calls

var obj2=[{name:"4134",calls:[]}],obj3=[{Channel:"SIP/4134-0004462a",State:"Up",Accountcode:"7013658596"},{Channel:"SIP/4334-sa",State:"Up",Accountcode:"07717754702"}];

var fun = (obj2, obj3) => {
  //creating temp object which conatin name as key and index as value from obj2
  var temp={};
  obj3.forEach((b,i)=>{
    var myRegexp = /\/(\d+)/g;
    var name=myRegexp.exec(b.Channel);
    temp[name[1]]=i;
  });
  
  obj2.forEach(a => {
    if(temp[a.name] !== undefined) {  //if temp object contain key then we need to merge this object
      var b = obj3[temp[a.name]];
      a.calls =  (a.calls || []).concat(Object.assign({}, { 
                     MobileNo: b.Accountcode, 
                     Status : b.State
                 }));
    }
  });
  console.log(obj2);
}
fun(obj2,obj3);
0 голосов
/ 21 сентября 2018

Поскольку name s находятся в предсказуемом месте внутри Channel, вы можете изначально построить объект, индексированный name s из obj3, а затем просто использовать скобочную запись, чтобы получить нужный вам массив,O(n):

var obj2 = [{
  "name": "4134",
  "calls": [
  ]
}];
var obj3 = [{
    Channel: 'SIP/4134-0004462a',
    State: 'Up',
    Accountcode: '7013658596'
  },
  {
    Channel: 'SIP/4334-sa',
    State: 'Up',
    Accountcode: '07717754702',
  }
]

const objsByName = obj3.reduce((a, item) => {
  const { Channel } = item;
  const name = Channel.match(/\/(\d+)/)[1];
  if (!a[name]) a[name] = [];
  a[name].push(item);
  return a;
}, {});
obj2.forEach(({ name, calls }) => {
  calls.push(...objsByName[name]);
});
console.log(obj2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...