des1roer
@des1roer
ученье - свет, а неученье - приятный полумрак

Js множественная проверка условий?

есть массив

var all = [
        {'id': 1, 'x': 3, 'y': 1.5, z: 1.5, ves: 100, v: 0.15, 'norma': 'до 15', money: 0, 'money_holiday': 100,
            wait: 100, dostavka_time: 500, dostavka_nighttime: 1000, dostavka_fixnighttime: 1500},
        {'id': 2, 'x': 3, 'y': 1.7, z: 1.6, ves: 50, v: 0.15, 'norma': 'до 15', money: 300, 'money_holiday': 300,
            wait: 100, dostavka_time: 500, dostavka_nighttime: 1000, dostavka_fixnighttime: 1500},
        {'id': 3, 'x': 3, 'y': 1.7, z: 1.6, ves: 100, v: 0.4, 'norma': 'до 15', money: 300, 'money_holiday': 300,
            wait: 100, dostavka_time: 500, dostavka_nighttime: 1000, dostavka_fixnighttime: 1500}
    ];


при изменении выпадающего списка думаю изменять все параметры формы

но есть дубли. т.е. если выбрали высоту 3 то получу 3 массива. а нужен один. поэтому нужно проверять и с другими элементами сходство

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

var indx = 0;
    for (var k in all) {
        if (all.hasOwnProperty(k)) {
            for (var i in all[k]) {
                if (all[k]['x'] == '3')
                {
                    indx++;
                    if (indx > 0)
                    {
                        indx = 0;
                        if (all[k]['x'] == '3' && all[k]['y'] == '1.7')
                        {
                            indx++;
                            if (indx > 0)
                            {
                                indx = 0;
                                if (all[k]['x'] == '3' && all[k]['y'] == '1.7' && all[k]['z'] == '1.6')
                                {
                                    console.log(i, all[k]);
                                }
                            }
                        }

                    }
                }
            }
        }
    }


это ужас, думаю нужно здесь юзать классы, но они какие то недоделанные в js, да и я js плохо знаю. может есть нормальное решение? если можно то рабочий код в студию
  • Вопрос задан
  • 704 просмотра
Пригласить эксперта
Ответы на вопрос 1
@Barlad
Системный администратор/Junior JS developer
Я правильно понимаю, что требуется отфильтровать массив по нескольким параметрам?

Если да, то вот моё решение:
// Функция проверки одного элемента на соответствие всем условиям
function checkAllConditions(el, conditions) {
	for (var key in conditions) {
		if (conditions.hasOwnProperty(key)) {
			if (el[key] != conditions[key]) return false;
		}
	}
	return true;
}

// Массив исходных значений
var all = [
        {'id': 1, 'x': 3, 'y': 1.5, z: 1.5, ves: 100, v: 0.15, 'norma': 'до 15', money: 0, 'money_holiday': 100,
            wait: 100, dostavka_time: 500, dostavka_nighttime: 1000, dostavka_fixnighttime: 1500},
        {'id': 2, 'x': 3, 'y': 1.7, z: 1.6, ves: 50, v: 0.15, 'norma': 'до 15', money: 300, 'money_holiday': 300,
            wait: 100, dostavka_time: 500, dostavka_nighttime: 1000, dostavka_fixnighttime: 1500},
        {'id': 3, 'x': 3, 'y': 1.7, z: 1.6, ves: 100, v: 0.4, 'norma': 'до 15', money: 300, 'money_holiday': 300,
            wait: 100, dostavka_time: 500, dostavka_nighttime: 1000, dostavka_fixnighttime: 1500}
    ];

// Объект с условиями
var cond = {
	'x': '3',
	'y': '1.7',
	'z': '1.6'
};

// Фильтруем исходный массив и получаем новый, в котором присутствуют значения, удовлетворяющие всем условиям
var newArr = all.filter(function(el, ind) {
	return checkAllConditions(el, cond)
})

// Вывод результата
console.log(newArr)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы