Как изменить несколько переменных для любой данной переменной внутри функции? - PullRequest
0 голосов
/ 19 октября 2018

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

Вот мой код:

function increment(x, y, z) {
    x += 1;
    y += 2;
    z += 3;
}

var a = 1;
var b = 1;
var c = 1;

var d = 20;
var e = 12;
var f = 8;

increment(a, b, c);
console.log(a + ", " + b + ", " + c);

increment(d, e, f);
console.log(d + ", " + e + ", " + f);

// desired output: 
// 2, 3, 4
// 21, 14, 11
// actual output: 
// 1, 1, 1
// 20, 12, 11

Ответы [ 5 ]

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

Функция генератора

Наконец, причина для создания Функции генератора!

Подпись

function *inc(array, count=0; maxInc=3)

Параметры

массив [Массив чисел] .....: любое количество цифр.

count [Number] [Default: 0] ..: определяет начальное значение приращения.

maxInc [Число] [По умолчанию: 3]: Определяет наибольшее значение приращения.

Описание

* inc () передает массивчисла, каждое число которых увеличивается в массиве на увеличенное число (например, +=1, +=2, +=3 и т. д.). Параметр count определяет значение первого приращения и остальных значений после него.Последний параметр определяет максимальное значение счетчика, прежде чем оно сбрасывается обратно до 0.

Return

Массив инкрементных чисел.


Демо

function *inc(array, cnt = 0, max = 3) {

  for (let i = 0; i < array.length; i++) {

    if (cnt > max) {
      cnt = 0;
    }
    cnt = i + 1;
    
    let b = array[i];
    
    b += cnt;
    
    yield b;
    
  }
  
}

const array = [1, 1, 1, 20, 12, 8];

for (let num of inc(array)) {
  console.log(num);
}
0 голосов
/ 19 октября 2018

Я хочу назначить новые значения 3 переменным внутри функции.

Если переменные всегда одинаковые, поместите функцию increment в область видимости переменных и закройтеих:

var x = 1, y = 1, z = 1;
function increment() {
    x += 1;
    y += 2;
    z += 3;
}
console.log(x, y, z);
increment();
console.log(x, y, z);
increment();
console.log(x, y, z);

Если есть разные наборы переменных, даже в разных областях, которые вы хотите увеличить с помощью общей функции, вам на самом деле не нужно 3 переменных.Вы хотите объект, который вы можете обойти и мутировать:

function increment(obj) {
    obj.x += 1;
    obj.y += 2;
    obj.z += 3;
}

var one = {x: 1, y: 1, z: 1};
console.log(one.x, one.y, one.z);
increment(one);
console.log(one.x, one.y, one.z);

var two= {x: 20, y: 12, z: 8};
console.log(two.x, two.y, two.z);
increment(two);
console.log(two.x, two.y, two.z);
0 голосов
/ 19 октября 2018

Вы можете использовать объектный формат для возврата ваших переменных

function increment(x, y, z) {
    return {
        x: x + 1,
        y: y + 2,
        z: z+ 3
    }
}

var incremented = increment(a, b, c);
console.log(incremented.x + ", " + incremented.y + ", " + incremented.z);

Надеюсь, это поможет.

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

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

console.clear()

let a = 1;
let b = 1;
let c = 1;

// destructuring the function's array parameter 
// to three variables x, y, and z
function increment([x, y, z]) {
  return [
    x+1, 
    y+2, 
    z+3
  ];
};

console.log('Before', a, b, c);
// destructuring the returned array of function `increment`
// to three variables a, b, and c
// no let or var before it, as a, b, and c are already declared
[a,b,c] = increment([a,b,c]);
console.log('After ', a, b, c);
0 голосов
/ 19 октября 2018

Возможность 1

function increment(...elem) {
  return elem.map(([x, y]) => x + y);
}

let a = 1;
let b = 1;
let c = 1;

let d = 20;
let e = 12;
let f = 8;

[
  a,
  b,
  c
] = increment([a, 1], [b, 2], [c, 3]);

console.log(`${a}, ${b}, ${c}`);

[
  d,
  e,
  f
] = increment([d, 10], [e, 2], [f, 5]);

console.log(`${d}, ${e}, ${f}`);

Возможность 2

function increment(...elem) {
  return elem.reduce((tmp, x, xi) => xi % 2 ? [
    ...tmp,
    
    x + elem[xi - 1],
  ] : tmp, []);
}

let a = 1;
let b = 1;
let c = 1;

let d = 20;
let e = 12;
let f = 8;

[
  a,
  b,
  c
] = increment(a, 1, b, 2, c, 3);

console.log(`${a}, ${b}, ${c}`);

[
  d,
  e,
  f
] = increment(d, 10, e, 2, f, 5);

console.log(`${d}, ${e}, ${f}`);

Возможность 3

function increment(obj, keysAndVal) {
  keysAndVal.forEach(([x, y]) => (obj[x] += y));
}

const vars = {
  a: 1,
  b: 1,
  c: 1,
  d: 20,
  e: 12,
  f: 8,
};

increment(vars, [
 ['a', 1],
 ['b', 5],
 ['c', 8],
]);

console.log(`${vars.a}, ${vars.b}, ${vars.c}`);

increment(vars, [
 ['d', 10],
 ['e', 2],
 ['f', 3],
]);

console.log(`${vars.d}, ${vars.e}, ${vars.f}`);

Возможность 4

function increment(elem, indexes, values) {
  indexes.forEach((x, xi) => (elem[x] += values[xi]));
}

const vals = [
 1,
 1,
 1,
 20,
 12,
 8,
];

increment(vals, [0, 1, 2], [10, 20, 30]);

console.log(`${vals[0]}, ${vals[1]}, ${vals[2]}`);

increment(vals, [3, 4, 5], [5, 10, 15]);

console.log(`${vals[3]}, ${vals[4]}, ${vals[5]}`);
...