У меня есть два массива, [a,b]
и [c,d,e,f,g,h]
. Возможные значения в массивах: 0, 1, 2 и 3.
Переменная устанавливается на основе значений в этих массивах, удовлетворяющих определенным условиям:
Есть ли менее подробный способ написать это, чем иметь большое количество циклов count for
, которые все выполняются с немного разными условиями?
у вас есть реальные примеры?
Покажите, что у вас есть, и мы будем рады улучшить это.
Вы можете сделать следующее без большого количества циклов for,
let a = [2,2,2,2];
let b = [2,2,2,2,3,1];
let countA = {0: 0, 1: 0, 2: 0, 3: 0};
let countB = {0: 0, 1: 0, 2: 0, 3: 0};
a.forEach(item => {
countA[item]++;
})
b.forEach(item => {
countB[item]++;
})
let n = 0;
if (countA[3] === a.length && countB[3] >= 2 && countB[0] === 0 && countA[0] === 0) {
n = 3;
} else if (countA[3] + countA[2] === a.length && countB[2] + countB[3] >= 4 && countB[0] === 0 && countA[0] === 0) {
n = 2;
} else if (countA[1] + countA[2] + countA[3] === a.length && countB[1] + countB[2] + countB[3] >= 4 && countB[0] === 0 && countA[0] === 0) {
n = 1;
}
console.info(n);
Отличный ответ, спасибо, я полностью упустил возможность просто добавить счетчики с учетом ограниченного диапазона значений.
Вы можете использовать методы массива Array#every()
и Array#filter()
следующим образом:
let a = [2,3];
let b = [2,2,2,2,3,0];
let c = [1,0];
let d = [2,3,0,0,1,1];
let e = [3,3];
let f = [3,3,3,2,2,2];
console.info( von(a,b) );
console.info( von(c,d) );
console.info( von(e,f) );
function von(a, b) {
return [3,2,1,0]
.filter(
v => a.every(x => x>=v) &&
b.filter(y => y>=v).length >= (v===3?2:4) &&
b.filter(y => y===0).length <= ([3,2].includes(v)?0:3)
)
[0];
}
Вы можете отсортировать массивы, а затем найти последний индекс значения, который соответствует вашим условиям.