Как я могу сохранить «предыдущую» и «следующую» итерацию объекта в цикле? - PullRequest
1 голос
/ 30 марта 2019

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

I 'я пробовал перебирать object.keys (может быть, я не понял, как правильно)

я пробовал вложения циклов (которые записывали отдельные буквы в строке restart)

let formattedTemps = [ 10,'restart',68,80,'restart',70.1,'restart',
  72,80,'restart',69,'restart',78,'restart',84,100,300,50,'restart',70,
'restart',90,'restart',50,'restart',100 ]

const switch = (Array) => {
  console.log(formattedTemps)
  let previousValue = 0
  let nextValue = 0
  for (let elements of array) {
    console.log(previousValue)
    console.log(nextValue)
    // let previousValue = elements[-1]
    // let nextValue = elements[1]
    //console.log(previousValue , element, nextValue
        // save the iterables beside 'restart' on both sides here
      }
    }

Мои ожидаемые результаты состоят в том, что я получаю значение как до, так и после записи в журнал строки «restart» (потому что тогда я бы сравнил их).

То, что происходило, - это целая куча неопределенных значений, а именно: несколько строк неопределенных, «перезапуск», неопределенных (с закомментированным кодом) и нескольких нулей с ним, как и сейчас.

Ответы [ 4 ]

1 голос
/ 30 марта 2019

Вы можете отобразить новые массивы, если фактическим значением является строка.Затем отфильтруйте и сохраните массивы.

var array = [10, 'restart', 68, 80, 'restart', 70.1, 'restart', 72, 80, 'restart', 69, 'restart', 78, 'restart', 84, 100, 300, 50, 'restart', 70, 'restart', 90, 'restart', 50, 'restart', 100],
    result = array
        .map((v, i, a) => typeof v === 'string' && [a[i - 1], v, a[i + 1]])
        .filter(Boolean);

console.log(result.map(a => a.join(' ')));
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 30 марта 2019

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

const highLimitSwitch = (formattedTemps) => {
  for (const [index, operation] of formattedTemps.entries()) {
      const num1 = formattedTemps[index - 1];
      const num2 = formattedTemps[index + 1];
      if (typeof num1 === "number" && typeof operation === "string" && typeof num2 === "number") {
          console.log(num1, operation, num2);
      }
  }
};

Live Exmaple:

let formattedTemps = [10,'restart',68,80,'restart',70.1,'restart',
  72,80,'restart',69,'restart',78,'restart',84,100,300,50,'restart',70,
'restart',90,'restart',50,'restart',100 ];

const highLimitSwitch = (formattedTemps) => {
  for (const [index, operation] of formattedTemps.entries()) {
      const num1 = formattedTemps[index - 1];
      const num2 = formattedTemps[index + 1];
      if (typeof num1 === "number" && typeof operation === "string" && typeof num2 === "number") {
          console.log(num1, operation, num2);
      }
  }
};

highLimitSwitch(formattedTemps);
.as-console-wrapper {
  max-height: 100% !important;
}

(Обратите внимание, как 70.1 используется дважды, как num2 и как num1 следующей операции, потому что междудва 'restart' с в данных примера.)


Или, если вы можете , предположите , что когда вы видите строку, у нее есть числа по обе стороны от нее (как ваш * 1022)* принятый в настоящее время ответ делает), тогда еще проще:

const highLimitSwitch = (formattedTemps) => {
  for (const [index, operation] of formattedTemps.entries()) {
      if (typeof operation === "string") {
          const num1 = formattedTemps[index - 1];
          const num2 = formattedTemps[index + 1];
          console.log(num1, operation, num2);
      }
  }
};

Live Exmaple:

let formattedTemps = [10,'restart',68,80,'restart',70.1,'restart',
  72,80,'restart',69,'restart',78,'restart',84,100,300,50,'restart',70,
'restart',90,'restart',50,'restart',100 ];

const highLimitSwitch = (formattedTemps) => {
  for (const [index, operation] of formattedTemps.entries()) {
      if (typeof operation === "string") {
          const num1 = formattedTemps[index - 1];
          const num2 = formattedTemps[index + 1];
          console.log(num1, operation, num2);
      }
  }
};

highLimitSwitch(formattedTemps);
.as-console-wrapper {
  max-height: 100% !important;
}
1 голос
/ 30 марта 2019

Мы можем использовать Array.reduce для захвата последнего индекса итерации в аккумуляторе (аккумулятор или acc в моем коде является первым параметром обратного вызова Array.reduce) и выводить толькоprevious и next, когда текущий элемент равен restart или любому string

Вот моя попытка объяснить логику этого:

  • В 1-й итерации, ничего не печатается, так как элемент является number.Мы просто возвращаем текущий индекс как значение аккумулятора.
  • Во второй итерации условие typeof ele === "string" удовлетворяется, поэтому теперь значение acc равно 0 (так как оно содержит последний посещенныйindex), который будет равен previous, а следующий на единицу больше текущего индекса.
  • Каждый раз, когда последний посещенный индекс итерации массива возвращается как значение аккумулятора (acc), который мыможно использовать в текущей итерации, чтобы найти значение предыдущего элемента.Затем мы печатаем, если текущий элемент является строкой.Значение следующего элемента будет находиться на единицу больше, чем текущий индекс idx массива.

let formattedTemps = [ 10,'restart',68,80,'restart',70.1,'restart',
  72,80,'restart',69,'restart',78,'restart',84,100,300,50,'restart',70,
'restart',90,'restart',50,'restart',100 ]

const highLimitSwitch = (formattedTemps) => {
  formattedTemps.reduce((acc, ele, idx, arr) => {
   if(typeof arr[acc] === "number" && typeof ele === "string" && typeof arr[idx + 1] === "number"){
     console.log(`${arr[acc]} ${ele} ${arr[idx + 1]}`)
   }
   return idx;
  }, 0)
}
highLimitSwitch(formattedTemps);
1 голос
/ 30 марта 2019

Циклически используйте индекс вместо использования for of. Затем, если элемент с этим индексом равен 'restart', вы можете вернуться назад на один индекс и переслать один индекс, чтобы получить значения.

let formattedTemps = [ 10,'restart',68,80,'restart',70.1,'restart',
  72,80,'restart',69,'restart',78,'restart',84,100,300,50,'restart',70,
'restart',90,'restart',50,'restart',100 ]

for (let i = 0; i < formattedTemps.length; i++) {
  let temp = formattedTemps[i]
  if (typeof temp === 'string') {
    beforeTemp = formattedTemps[i-1];
    afterTemp = formattedTemps[i+1];
    console.log(beforeTemp, temp, afterTemp);
  }
}
...