Найдите минимальное (максимальное) значение среди всех свойств объекта и верните результат как объект или (измените исходный объект) - PullRequest
1 голос
/ 07 мая 2020

Это немного простая на первый взгляд задача с поиском минимальных / максимальных значений в Object, стала для меня проблемой.

У меня есть следующий объект (с 3 фиксированными ключами):

let object_ = {
    vendor: 5, //(Number),
    market: 2, //(Number)
    derivative: {
        price: 15 //(Number)
    }
}

И я пытаюсь найти не только минимальное / максимальное значение, но и вернуть его как объект / изменить исходное, которое должно выглядеть так:

результат для min: // как объект

{ market: 2}

результат для max: // как объект

derivative: {
    price: 15 //(Number)
}

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

/** Create an array of objects from object_*/

let array = [
   {market: 2},
   {vendor: 5},
   {derivative: 15}
]

/** Find the necessary values in array with map and reduce*/

И затем поиск минимальных / максимальных значений для всех объектов внутри массива, но проблема в том, что я должен преобразовать результат моего кода вернемся к исходной схеме, например:

if (resultObject.property === 'derivative') {
   resultObject.derivative = {
      price: resultObject.derivative  //15
   }
}

Итак, вопрос:

Я на правильном пути, должен ли я создать Array of objects для этого случая? Потому что для меня важно возвращать не только само число, но и настраиваемое свойство с именем.

Может быть, у кого-то есть более лучшее / более короткое решение с синтаксисом ES6 или изменение исходного объекта со свойствами delete не min (or max). Или можете указать мне путь к нему?

Ответы [ 3 ]

1 голос
/ 07 мая 2020

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

Этот подход работает только для одного минимального и максимального значений.

const
    getValues = object => {
        return Object
            .entries(object)
            .flatMap(([k, v]) => v && typeof v === 'object'
                ? getValues(v).map(([keys, v]) => [[k, ...keys], v])
                : [[[k], v]]
            );
    },
    setValue = (target, [keys, value]) => {
        const last = keys.pop();
        keys.reduce((o, k) => o[k] = o[k] || {}, target)[last] = value;
        return target;
    },
    getMinMax = object => {
        const
            [min, max] = getValues(object)
                .reduce((r, v, i) => {
                    if (!i) return [v, v];
                    if (v[1] < r[0][1]) r[0] = v;
                    if (v[1] > r[1][1]) r[1] = v;
                    return r;
                }, [])
                .map(v => setValue({}, v));
        return { min, max };
    },
    object = { vendor: 5, market: 2, derivative: { price: 15 } },
    result = getMinMax(object);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 07 мая 2020

В начале функции установите min index равным 0. Затем l oop через каждый ключ в объекте из индекса 1. Проверьте, является ли значение ключа объектом, и если оно вызывает текущую функцию для и установите значение возвращенного значения. Затем проверьте, меньше ли значение по индексу. Если для него установлено значение i. В конце верните объект со значением.

function getMin(obj) {
    let minIndex = 0;
    let keys = Object.keys(obj); //Get all the keys in the object
    for(let i = 0;i < keys.length;i++) { // Loop through the keys
        let value = obj[keys[i]];
        if(typeof value !== 'number') { // If it's not a number get the minimum value in the object
            value = getMin(value);
        }
        if(value < obj[keys[minIndex]]) minIndex = i; //If the value is less than the value at the min index, set the min index to the current index
        // You can just change the sign to greater for the max function
    }
    let returnObject = {};
    returnObject[keys[minIndex]] = obj[keys[minIndex]]; // Sets the object so it doesn't only return the value
    return returnObject;
}
0 голосов
/ 07 мая 2020

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

let object = {
    market: 5,
    vendor: 2,
    derivative: {
        price: 15
    }
};

let bufferArray = [];

for (const property in object) {
    if (typeof object[property] === 'object') {
        bufferArray.push({name: property, value: object[property].price});
    } else {
        bufferArray.push({name: property, value: object[property]});
    }
}

let {name, value} = bufferArray.reduce((prev, curr) => prev.value < curr.value ? prev : curr); //just change < to > for max value
let newObject = {[name]: value};
console.log(newObject); //{ vendor: 2 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...