Зачем мне нужен мудрый оператор для доступа к последнему элементу массива? - PullRequest
2 голосов
/ 19 июня 2020

У меня есть следующий код, который должен найти пересечение между двумя строками в таком массиве ["1, 3, 4, 7, 13", "1, 2, 4, 13, 15"] Он должен дать результат: 1,4,13

  function FindIntersection(strArr) { 

    const firstArr = strArr[0].split(", ");
    const secondArr = strArr[1].split(", ");

    let newArr = [];
    let i = 0;
    let j = 0;


    while(i < firstArr.length && j < secondArr.length) {
      let a = firstArr[i] | 0;
      let b = secondArr[j] | 0;
      if(a === b) {
        newArr.push(a);
        i++;
        j++;
      } else if(a > b) {
        j++;
      } else if (b > a) {
        i++;
      }
    }

    strArr = newArr.join(",");

    return strArr; 

}

Когда я не использую побитовый оператор | 0 к последнему элементу в массиве не обращаются должным образом, почему? Как побитовый оператор решает эту проблему?

Ответы [ 3 ]

2 голосов
/ 19 июня 2020

Для ясности, вы не обращаетесь к элементу массива с помощью побитового оператора, вы обращаетесь к элементу с числами в i и j, а затем используете побитовое ИЛИ для преобразования элемент в число.

Несколько других способов преобразовать строку, представляющую число, в число:

"3" | 0 -> 3
"3" * 1 -> 3
+"3" -> 3
parseInt("3") -> 3
2 голосов
/ 19 июня 2020

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

typeof('str' | 0) === 'number'

Но это отстой, верно, поскольку 'str' вероятно, это ошибка. Я был бы более явным и использовал бы:

let a = parseInt(firstArr[i], 10);

Это вернет NaN, если это недействительное целое число, а NaN === NaN равно false, поэтому вы случайно не добавите его в newArr.

1 голос
/ 19 июня 2020

Преобразование строки в число, с parseInt тоже работает

  function FindIntersection(strArr) { 

    const firstArr = strArr[0].split(", ");
    const secondArr = strArr[1].split(", ");

    let newArr = [];
    let i = 0;
    let j = 0;


    while(i < firstArr.length && j < secondArr.length) {	
      let a = parseInt(firstArr[i]);
      let b = parseInt(secondArr[j]);
      if(a === b) {
        newArr.push(a);
        i++;
        j++;
      } else if(a > b) {
        j++;
      } else if (b > a) {
        i++;
      }
    }

    strArr = newArr.join(",");

    return strArr; 

}

Этот способ тоже работает, используя объект Number

  function FindIntersection(strArr) { 

    const firstArr = strArr[0].split(", ");
    const secondArr = strArr[1].split(", ");

    let newArr = [];
    let i = 0;
    let j = 0;


    while(i < firstArr.length && j < secondArr.length) {	
      let a = Number(firstArr[i]);
      let b = Number(secondArr[j]);
      if(a === b) {
        newArr.push(a);
        i++;
        j++;
      } else if(a > b) {
        j++;
      } else if (b > a) {
        i++;
      }
    }

    strArr = newArr.join(",");

    return strArr; 

}

console.log(FindIntersection(["1, 3, 4, 7, 13", "1, 2, 4, 13, 15"]));
...