Как обеспечить соблюдение порядка элементов массива js при добавлении их в содержащий массив? - PullRequest
1 голос
/ 06 августа 2020

Я просматриваю массив и пытаюсь найти, где сумма двух элементов равна 10.

Я нахожу правильные пары совпадений ... но для двух из них порядок не сохраняется при их добавлении.

Я ожидаю получить

[ [9,1], [6,4], [3,7], [7,3], [6,4], [1,9] ]

, но получаю

[ [9,1], [6,4], [3,7], [3,7], [6,4], [9,1] ]

i.e.  =>                ^^^           ^^^
are different

Почему две указанные пары имеют обратный порядок?

  newNums = [];
  nums.forEach(num1 => {
    nums.forEach(num2 => {
      num1Position = nums.indexOf(num1);
      num2Position = nums.indexOf(num2);
      if (num1 + num2 === 10 && num2Position > num1Position )  {
        newNums.push([num1, num2]);
      }
    })
  })
  return newNums;
}

result = sumTwoNumbersIsTen([9,6,3,7,3,6,4,2,0,1,9])
console.log(result); // should be [ [9,1], [6,4], [3,7], [7,3], [6,4], [1,9] ]
// but I get                      [ [9,1], [6,4], [3,7], [3,7], [6,4], [9,1] ]
//                

Ответы [ 3 ]

3 голосов
/ 07 августа 2020

Вы можете перебирать индексы и опускать части, которые недействительны.

Кстати, неплохо объявить все переменные.

const sumTwoNumbersIsTen = nums => {
    const newNums = [];
    for (let i = 0; i < nums.length - 1; i++) {
        const num1 = nums[i];
        for (let j = i + 1; j < nums.length; j++) {
            const num2 = nums[j];
            if (num1 + num2 === 10) {
                newNums.push([num1, num2]);
            }
        }
    }
    return newNums;
};

console.log(sumTwoNumbersIsTen([9, 6, 3, 7, 3, 6, 4, 2, 0, 1, 9])); // [[9, 1], [6, 4], [3, 7], [7, 3], [6, 4], [1, 9]]
1 голос
/ 07 августа 2020

Потому что вы используете неправильные позиции. Вместо того, чтобы брать позицию элемента из текущей итерации, которую forEach передает вашему обратному вызову, вы ищите индекса в массиве, где можно найти значение. Для повторяющихся значений всегда будет найден первый индекс, а не тот, который вам нужен (к тому же это ужасно неэффективно).

newNums = [];
nums.forEach((num1, num1Position) => {
  nums.forEach((num2, num2Position) => {
    if (num1 + num2 === 10 && num2Position > num1Position )  {
      newNums.push([num1, num2]);
    }
  })
})
0 голосов
/ 07 августа 2020

Проблема в том, что (например) в массиве две девятки, а .indexOf находит только индекс первого появления.

Вы можете решить эту проблему, не используя indexOf и вместо этого используя, что обратный вызов forEach может принимать второй параметр, который является индексом элемента:

function sumTwoNumbersIsTen(nums) {
  newNums = [];
  nums.forEach((num1, num1Position) => {
    nums.forEach((num2, num2Position) => {
      if (num1 + num2 === 10 && num2Position > num1Position )  {
        newNums.push([num1, num2]);
      }
    })
  })
  return newNums;
}

result = sumTwoNumbersIsTen([9,6,3,7,3,6,4,2,0,1,9])
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...