проблемы с циклом for внутри другого цикла Javascript - PullRequest
0 голосов
/ 08 ноября 2018

У меня проблемы с прохождением этих двух циклов for, мне нужно получить одинаковые элементы из первого массива в цикле, но значения повторяются. Я знаю, что они повторяются в зависимости от данных второго массива.

Я пытался провести сравнение, но не смог получить желаемый результат.

var array = [
{
  grouper: 1
},
{
  grouper: 2
},
{
  grouper: 3
},
{
  grouper: 4
},
];


var array2 = [
{
  value: 1,
  grouper: 1,
  status: 100
},
{
  value: 2,
  grouper: 2,
  status: 100
},
{
  value: 3,
  grouper: 3,
  status: 100
}
];


for(var i = 0; i<array.length; i++){
   for(var j = 0; j<array2.length; j++){
      if(array2[j].grouper == array[i].grouper){
        console.log(array[i].grouper+'-'+array2[j].value);
      }
   }
}

Это результат, который я хочу, мне нужны все группировщики из первого массива и значения из второго массива:

1-1
2-2
3-3
4-

Группер 4, не имеет значения, но мне нужно показать его.

Мне нужен второй массив, потому что я собираюсь сравнить с данными из второго массива

Я не знаю, правильно ли я делаю процесс. Я надеюсь, что вы можете мне помочь.

Ответы [ 3 ]

0 голосов
/ 08 ноября 2018

Вы можете просто отследить, было ли совпадение (переменная shown), и если его не было, отобразить строку "наполовину":

var array = [{grouper: 1},{grouper: 2},{grouper: 3},{grouper: 4},];

var array2 = [
{value: 1, grouper: 1, status: 100},
{value: 2, grouper: 2, status: 100},
{value: 3, grouper: 3, status: 100}
];

for(var i = 0; i<array.length; i++){
   var shown=false;
   for(var j = 0; j<array2.length; j++){
      if(array2[j].grouper == array[i].grouper){
        console.log(array[i].grouper+'-'+array2[j].value);
        shown=true;
      }
   }
   if(!shown){
     console.log(array[i].grouper+"-");
   }
}
0 голосов
/ 08 ноября 2018

@ FabianSierra ... с предоставленным вами примером нужно просто обработать невыполненное условие / условие if в самом внутреннем цикле.

Более общий подход может также учитывать изменение имен полей (ключей).Таким образом, функция и подход, основанный на Array.reduce / Array.find, обеспечивают лучшее повторное использование кода.Тогда пример реализации может выглядеть примерно так ...

var array = [{ // in order.
  grouper: 1
}, {
  grouper: 2
}, {
  grouper: 3
}, {
  grouper: 4
}];

var array2 = [{ // not in the order similar to `array`.
  value: 22,
  grouper: 2,
  status: 200
}, {
  value: 33,
  grouper: 3,
  status: 300
}, {
  value: 11,
  grouper: 1,
  status: 100
}];


function collectRelatedItemValuesByKeys(collector, item) {
  var sourceKey = collector.sourceKey;
  var targetKey = collector.targetKey;
  var targetList = collector.targetList;
  var resultList = collector.result;

  var sourceValue = item[sourceKey];
  var targetValue;
  var relatedItem = targetList.find(function (targetItem) {

    return (targetItem[sourceKey] === sourceValue);
  });
  if (typeof relatedItem !== 'undefined') {

    targetValue = relatedItem[targetKey];

  } else if (typeof targetValue === 'undefined') {

    targetValue = ''; // `relatedItem` does not exist.
  }
  resultList.push([sourceValue, targetValue].join('-'));
  
  return collector;
}


var resultList = array.reduce(collectRelatedItemValuesByKeys, {

  sourceKey: 'grouper',
  targetKey: 'value',
  targetList: array2,
  result: []

}).result;

console.log('resultList : ', resultList);

resultList = array.reduce(collectRelatedItemValuesByKeys, {

  sourceKey: 'grouper',
  targetKey: 'status',
  targetList: array2,
  result: []

}).result;

console.log('resultList : ', resultList);
.as-console-wrapper { max-height: 100%!important; top: 0; }
0 голосов
/ 08 ноября 2018

Прежде всего, на примере, который вы привели, я верю, что вы хотите вернуться:

1,2,3

В массиве 2 нет 4-го объекта, поэтому ваш условный (array2[j].grouper == array[i].grouper никогда не будет иметь значение true.

Вопрос в том, всегда ли вы сравниваете одни и те же показатели? В этом примере вы сравниваете array [0] с array2 [0], чтобы увидеть, равен ли grouper в массиве grouper в array2 ... вот и все ????

В этом случае вы просто делаете один цикл:

for (var i = 0; i < array.length; i++) {
      if (array[i].grouper == array2[i].grouper) {
        console.log(array[i].grouper+'-'+array2[j].value);
      }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...