Изменить массив в цикле и начать с ранее добавленного элемента - PullRequest
0 голосов
/ 18 октября 2018

Я хотел бы зациклить массив и добавить в массив, но затем внутри цикла использовать ранее добавленный элемент.Поэтому я хотел бы сделать цикл 1,4,1 и добавить 0,5 между 1 и 4 и обратно к 1. Таким образом, конечная строка или массив будет иметь вид:

1 1,5 2 2,5 3 3,5 4 и т. Д.

Проблема в том, что я могу добавить элемент индекса, но не добавить элемент ТО в цикле.Первый цикл равен 1, затем я добавляю 1,5, а второй цикл должен быть 1,5, но вместо этого цикл будет равен 4.

base_string = '1,4,1';
base_string = base_string.split(',');

for (var i = 0; i < base_str.length; i++) {

// I add 1.5 to array and I want to use that the next loop, but the next loop is 4 instead

}

Ответы [ 5 ]

0 голосов
/ 18 октября 2018

Вы можете использовать функцию " уменьшить " следующим образом:

var base_string = '1,2,3,4';
base_string = base_string.split(',').reduce((a, v, i, ar) => {
  if (i === 1) {
    // an array is created using the first two values of original the array
    return [+a, +a + 0.5, +v, +v + 0.5];
  }
  // after index 2 you add an extra item +0.5
  a.push(+v);
  a.push(+v + 0.5);
  return a;
});
console.log(base_string);

Это даст вам желаемый результат:

[1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5]

Обратите внимание, что символ плюс (+) был добавлен перед каждым значением, потому что онибыли строковыми значениями, поэтому их нужно было привести к числу.

0 голосов
/ 18 октября 2018

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

var string = '1,4,1',
    result = string
        .split(',')
        .map(Number)
        .reduce((r, v) => {
            if (!r) return [v];
            let last = r[r.length - 1],
                delta = v > last ? 0.5 : -0.5;
            while (last + delta !== v) r.push(last += delta);
            r.push(v);
            return r;
        }, undefined);
   
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
0 голосов
/ 18 октября 2018

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

let arr = [1, 4, 1]
let res = [arr[0]]
let step = 0.5
for (let i = 1; i < arr.length; i++) {
  let direction = arr[i] > arr[i - 1] ? 1 : -1
  for (let j = (direction * arr[i - 1]) + step; j <= (direction * arr[i]); j += step) {
    res.push(j * direction)
  }
}
console.log(res)
0 голосов
/ 18 октября 2018

это должно работать с любым массивом.

var base_string = '1,4,1,7,2';
base_string = base_string.split(',');

var new_string = []; 
for(var i=0; i<base_string.length-1; i++){
   if(base_string[i+1]>base_string[i]){
     for(var j=parseInt(base_string[i]); j<parseInt(base_string[i+1]); j+=.5){
         new_string.push((j))
     }
   }
  else  if(base_string[i+1]<base_string[i]){
     for(var j=parseInt(base_string[i]); j>=parseInt(base_string[i+1]); j-=.5){
         new_string.push((j))
     }
   }
}
console.log("new_string: "+new_string);
0 голосов
/ 18 октября 2018

let base_string = '1,4,1';
let base_array = base_string.split(',').map(i => +i);
let inc = 0.5; // the number to add in every step
let res = [];

let i = 0;

// Iterate till the last element is reached
while(i < base_array.length) {
  // Iterate till there is some difference between adjacent items
  while(Math.abs(base_array[i] - base_array[i+1]) > inc) {
    res.push(base_array[i]);
    
    if(base_array[i] < base_array[i+1]) base_array[i] += 0.5;
    else base_array[i] -= 0.5;
  }
  
  i++;
}

res.push(base_array[i-1]); // add the last element

console.log(res.join(' '));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...