Для каждого условия, которое оказывается истинным на всех итерациях, поместите значение счетчика в новый массив - PullRequest
0 голосов
/ 13 июня 2018

У меня есть несколько массивов, но некоторые из них имеют значения 0 или не определены.То, что я пытаюсь сделать, это каждый раз, когда условие выполняется, вставить значение counter в новый массив.

let array1 = [5, 6, 44, 2, 6];
let array2 = ['', '', '', 5 , 7];

Я получил это далеко, но он возвращает только уникальные значения.То есть, давайте представим, что у нас есть эти два массива выше, во-первых, все значения - array1 , во-вторых - array2 (индекс 0, 1, 2 равен нулю, но индекс 3 и4 имеет свои числовые значения).Функция, приведенная ниже, возвращает -> [1, 2].

empNum = (data) => {
let activeArr = [];
let activeOnes = 0;
    for (let i=0; i<data.length; i++) {
        if (active[i] !== 0 && active[i] !== '') {
            activeOnes ++;
            activeArr.push(activeOnes);
        }

    }
    return activeArr;  // [1, 2 ] < -- This is not what I need.
}

В первых трех запусках только один массив проходит условие [1, 1, 1], но при 4-м и 5-м запусках обаМассивы проходят тест, поэтому следующие две записи должны быть [2, 2].

Итак, я пытаюсь достичь нового массива, похожего на этот - [1, 1, 1, 2, 2].

Примечание: Число массивов не равно двум.Есть много других одинаковой длины , и их количество (количество массивов) может со временем увеличиваться, а также количество записей внутри каждого из них, но в конце они всебудет иметь ту же длину.

Может быть, какой-то другой тип цикла?Есть предложения?

Ответы [ 3 ]

0 голосов
/ 13 июня 2018

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

Здесь используется троичный оператор (условный оператор) *Великие роли играют 1005 * и 2 логических оператора &&, ||. Код работает как для 0, '', так и для undefined, null.

Попробуйте онлайн на http://rextester.com/HYR69124.

// empNum() is a function which takes 2 arrays of same length as parameters
var empNum = (data1, data2) => {
    var activeArr = [];

    for (var i=0; i<data1.length; i++) {
        activeArr.push(data1[i] && data2[i] ? 2 : 1); // Using ternary operator ?:
    }
    return activeArr; 
}

// Test 1
var array1= [5, 6, 44, 2, 6];
var array2 = ['', '', '', 5, 7];
console.log(empNum(array1, array2)); //[ 1, 1, 1, 2, 2 ]

// Test 2
console.log(empNum([5, 0, 44, 2, 6], [8, 7, undefined, 5, 7,] )); // [ 2, 1, 1, 2, 2 ]

// Test 3
console.log(empNum(["JavaScript", 0, undefined, null, 6], [8, 7, undefined, 5, 7,] )); // [ 2, 1, 1, 1, 2 ]


// Test 4
console.log(empNum([0, 0, 44, 2, "Python"], [8, 7, undefined, 5, 7,] )); // [ 1, 1, 1, 2, 2 ]

"Выход

[ 1, 1, 1, 2, 2 ]
[ 2, 1, 1, 2, 2 ]
[ 2, 1, 1, 1, 2 ]
[ 1, 1, 1, 2, 2 ]
0 голосов
/ 15 июня 2018

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

Это довольно просто, используя lodash's zip:

const array1 = [5, 6, 44, 2, 6];
const array2 = ['', '', '', 5 , 7];
const array3 = [1, '', 0, 1, false]

const zipped = _.zip(array1, array2, array3);

// `zipped` should now look like this, where each element
// is an array that represents all of the elements a given
// position from all of the original arrays.
// [
//     [5, "", 1],
//     [6, "", ""],
//     [44, "", 0],
//     [2, 5, 1],
//     [6, 7, false],
// ]

const results = _.map(zipped, (array) => {
    // lodash doesn't seem to have a `count`, but it does have `countBy`
    const counts = _.countBy(array, (element) => new Boolean(element));

    // Here `counts` will be an object showing how many items in the array were `true` and how many were `false`.
    // For example, in the first iteration, it will look like `{ "false": 1, "true": 2 }`

    // So, only return the count that is `true`.
    return counts['true'];    
});

// Here, the results is:
// [2, 1, 1, 3, 2]

Этот скрипт можно найти вhttps://runkit.com/amiel/5b22dffb85fb2d00128e2217, если вы хотите запустить его и посмотреть результаты.

0 голосов
/ 13 июня 2018

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

let array1 = [5, 6, 44, 2, 6];
let array2 = ['', '', '', 5 , 7];

const result = array1.map((item1, i) => {
  const item2 = array2[i];
  return Boolean(item1) + Boolean(item2); // gets converted to number
});
console.log(result);

Это, конечно, при условии, что массивы имеют одинаковое количество элементов.Если нет, вы можете сначала использовать Math.max для длин обоих массивов.

Если у вас есть несколько массивов, сначала поместите их в один массив, а затем выполните итерацию по этому массиву:

const arrs = [
  [5, 6, 44, 2, 6],
  ['', '', '', 5 , 7],
];
const { length } = arrs[0];
const result = Array.from(
  { length },
  (_, i) => arrs.reduce((a, arr) => a + Boolean(arr[i]), 0)
);
console.log(result);

Или вы можете предпочесть доступ к каждому подмассиву только один раз:

const arrs = [
  [5, 6, 44, 2, 6],
  ['', '', '', 5 , 7],
];
const { length } = arrs[0];
const result = [];
arrs.forEach(arr =>
  arr.forEach((item, i) => result[i] = (result[i] || 0) + Boolean(item))
);
console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...