Преобразовать набор переменных истинного логического значения в массив - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть набор логических значений следующим образом

var prodcat1 = true;
var prodcat2 = false;
var prodcat3 = false;
var prodcat4 = false;
var prodcat5 = false;
var prodcat6 = false;
var prodcat7 = false;
var prodcat8 = false;
var prodcat9 = false;
var prodcat10 = true;

Как преобразовать все истинные переменные в один массив следующим образом.

  var array = ["prodcat1", "prodcat10"]

Ответы [ 5 ]

0 голосов
/ 28 декабря 2018
let arr = [], arr2=[];

for (let i=1; i<=10; i++) {
  if (eval("prodcat" + i)) {
    arr.push(eval("prodcat" + i));
  }else arr2.push(eval("prodcat" + i));
}

будет вашим решением на данный момент

0 голосов
/ 28 декабря 2018

Вы можете сделать:

const prodcat1 = true;
const prodcat2 = false;
const prodcat3 = false;
const prodcat4 = false;
const prodcat5 = false;
const prodcat6 = false;
const prodcat7 = false;
const prodcat8 = false;
const prodcat9 = false;
const prodcat10 = true;

const result = Array
  .from({length: 10}, (v, i) => i + 1)
  .reduce((a, c) => eval(`prodcat${c}`) ? [...a, `prodcat${c}`] : a, []);

console.log(result);
0 голосов
/ 28 декабря 2018

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

var prodcat1 = true;
var prodcat2 = false;
var prodcat3 = false;
..  ...        ...
..  ...        ...
var prodcat10 = true;

var myArr = []
//now test for values and push in myArr manually

if (prodcat1) {
    myArr.push('prodcat1')
}
if (prodcat2) {
    myArr.push('prodcat2')
}

Другой подход - использовать eval.Но eval очень непредсказуемо и его следует избегать.

for (let i = 1; i <= 10; i++) {
    if (eval('prodcat' + i)) {
        myArr.push('prodcat' + i)
    }
}

На мой взгляд, лучший подход - использовать объект для хранения ваших значений.

var myProdcats = {
    prodcat1: true,
    prodcat2: false
}
var myArray = Object.keys(myProdcats).filter(prodcat => myProdcats[prodcat])  // ["prodcat1", "prodcat2"]
0 голосов
/ 28 декабря 2018

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

Чтобы ответить на ваш вопрос в любом случае, вы можете ответить на него так:

let trueArray = [];

for(let i = 1; i <=10; i++){
    if(window["prodcat" + i])
    trueArray.push("prodcat" + i)
}

console.log(trueArray)
0 голосов
/ 28 декабря 2018

Вы немного нарисовали себя в углу, используя имена переменных, такие как prodcat5, потому что вы не можете по-настоящему перебрать их без использования страшной функции eval().

let arr = [];

for (let i=1; i<=10; i++) {
  if (eval("prodcat" + i)) {
    arr.push("prodcat" + i);
  }
}

Это довольноплохой способ сделать это, eval(), как правило, может представлять угрозу безопасности.

Еще одно решение, возможно, лучшее (если вы запускаете код в браузере), это то, что придумал ThatBrianDudeс помощью (см. ниже), с помощью (ab) объекта window.

Но все эти решения имеют недостатки, поскольку проблемы можно легко избежать.Намного лучшим решением было бы иметь массив с именем prodcat и хранить в нем значения следующим образом:

prodcat[0] = true;
prodcat[1] = false;
/* etc... */

Тогда вы можете легко перебирать их.

...