Задать вопрос
@max_bu

Поиск минимального значения в массиве объектов?

Задача: Вася ищет наименьший вариант, у него массив
var array = [ 
 { base : 10, upOne: 2, upTwo: 5, upThree: 9}, // 26
 { base : 14, upOne: 1, upTwo: 3, upThree: 5}, // 23
 { base : 11, upOne: 2, upTwo: 3, upThree: 9} // 25
 ]

Он на сайте выбирает свою Цель, ему выдается предварительный вариант объекта с наименьшим base значением. (это реализовал)

Потом он докручивает свою цель чекбоксами которые поднимают его base значение.

До меня дошло, что вторым шагом он выбирает какие чекбоксы активировать: upOne/upTwo/upThree и может оказаться так, что выгоднее для Васи вариант не с наименьшим base значением.

ВОПРОС: Как правильно выдавать Васе лучший вариант из масcива с учетом выбранных его чекбоксов?

Вот мои мысли:
0. Получить массив с объектами
1. Найти объект с наименьшим максимальным значением array[1]
2. Выдать Васе base значение array[1].base // 14
3. Показать Васе соответствующие значения чекбоксов выбранного объекта array[1].upOne, array[1].upTwo, array[1].upThree
4. Если чекбокс активирован ( upOne == true ) то вернуться на шаг 1 и найти объект с наименьшим значением base + upOne
// Вот что то мне подсказывает, тут я не туда свернул.
  • Вопрос задан
  • 5962 просмотра
Подписаться 2 Оценить Комментировать
Решения вопроса 3
DirecTwiX
@DirecTwiX
"display: flex;" уже предлагали?
Второй линк в гугле по запросу "js array min"
https://stackoverflow.com/questions/1669190/find-t...
function arrayMin(arr) {
  return arr.reduce(function (p, v) {
    return ( p < v ? p : v );
  });
}

function arrayMax(arr) {
  return arr.reduce(function (p, v) {
    return ( p > v ? p : v );
  });
}


Upd:
var array = [ 
 { base : 10, upOne: 2, upTwo: 5, upThree: 9}, // 26
 { base : 14, upOne: 1, upTwo: 3, upThree: 5}, // 23
 { base : 11, upOne: 2, upTwo: 3, upThree: 9} // 25
 ]

let selected = ['upOne', 'upTwo']

let getSum = (el) => {
  let r = el.base
  selected.forEach(i => r+= el[i])
  return r
}

function arrayMin(arr) {
  return arr.reduce(function (i, ac) {
    return ( getSum(i) < getSum(ac) ? i : ac );
  });
}

console.log(arrayMin(array))
Ответ написан
Ahen
@Ahen
Универсальный дилетант
Решение сортировкой. В результате пользователю просто отдаем первый (нулевой) элемент массива.
Идею нужно развить до нескольких чекбоксов, ничего сложного.
var selected = 'value2'; // Вместо чекбокса, суммироваться будет значение value1 и значение указанного в данной переменной свойства объекта.

var data = [
    {id: 1, value1: 1, value2: 23, value3: 1},
    {id: 2, value1: 3, value2: 3, value3: 2},
    {id: 3, value1: 1, value2: 6, value3: 4},
    {id: 4, value1: 23, value2: 8, value3: 67}
];

data.sort(function (x, y) {
    return x.value1 - y.value1 + x[selected] - y[selected];
});

var i;
for (i = 0; i < data.length; i++) {
    document.write("<p>id: " + data[i].id + " sum of value1 and " + selected + ": " + (data[i].value1 + data[i][selected]) + "</p>");
}


jsfiddle.net/n04878oj
Ответ написан
Krasnodar_etc
@Krasnodar_etc
fundraiseup
Вам от Васи надо принимать массив чекбоксов, которые он активировал. Как-то так:

var request = ['upOne', 'upThree']; // Допустим, Вася выбрал эти чекбоксы

function getSumm (ar, fields) {
// Сумма изначально равна base
var summa = ar.base || 0;
// Прибавляем значения из upOne и upThree
    fields.forEach(function( e ){
        summa += arr[e];
    });
return summa;
}

// array - взял из вашего примера, не стал объявлять только, лень.
// Считаем получившуюся сумму и сортируем массив
array.sort( function(a,b){
var summA = getSumm(a, request);
var summB = getSumm(b, request);
return summA - summB;
});

// Первый объект будет с наименьшей суммой.
var result = array[0];
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы