Нахождение максимального значения атрибута в массиве объектов в объекте - PullRequest
2 голосов
/ 18 июня 2019

У меня есть объект JavaScript и я хочу получить наибольшее значение из всех записей. Я пробовал это:

d = {
"A": [ {"value": 10}, {"value": 20}, {"value": 30} ],
"B": [ {"value": 50}, {"value": 60}, {"value": 1000} ],
}

Object.keys(d).map(
    function(k) { 
        Math.max.apply(Math, d[k].map(
            function(e) {
                console.log(value);
            }
        ))
    }
) 

Результат должен быть 1000.

Ответы [ 9 ]

7 голосов
/ 18 июня 2019

Вы можете использовать синтаксис распространения ... в Math.max после того, как вы map и сгладите массив.

const d = {
  "A": [ {"value": 10}, {"value": 20}, {"value": 30} ],
  "B": [ {"value": 50}, {"value": 60}, {"value": 1000} ],
}

const max = Math.max(...[].concat(...Object.values(d)).map(({value}) => value))
console.log(max)
2 голосов
/ 18 июня 2019

Используйте Object.values, flatMap и Math.max с разбрасыванием.

const d = {"A":[{"value":10},{"value":20},{"value":30}],"B":[{"value":50},{"value":60},{"value":1000}]};
const res = Math.max(...Object.values(d).flat().flatMap(Object.values));
console.log(res);

Поскольку flat не очень хорошо поддерживается (и не * flatMap), вы также можете использовать reduce.

const d = {"A":[{"value":10},{"value":20},{"value":30}],"B":[{"value":50},{"value":60},{"value":1000}]};
const res = Math.max(...Object.values(d).map(e => e.map(Object.values)).reduce((a, c) => [].concat(...a, ...c)));
console.log(res);
0 голосов
/ 18 июня 2019

Только простое использование карты, уменьшение и сцепление их вместе может дать вам желаемое максимальное значение. Я использовал подчеркивание js, но вы можете использовать простые методы map и сокращения для них.

var d = {
     "A": [ {"value": 10}, {"value": 20}, {"value": 30} ],
     "B": [ {"value": 50}, {"value": 60}, {"value": 1000} ],
     "C": [ {"value": 30}, {"value": 90}, {"value": 300} ],
     }

var maxvalue = _.reduce(_.map(d,(items)=>{  
    return _.reduce(items , (p,i)=>{
            return p> i.value ? p: i.value;
        },0)
}) , (maxy, iter)=>{
    return maxy > iter ? maxy: iter;
},0);
0 голосов
/ 18 июня 2019

Для реальной строки JSON это можно сделать во время синтаксического анализа:

var max = -Infinity, json = '{"A":[{"value":10},{"value":20},{"value":30}],"B":[{"value":50},{"value":60},{"value":1000}]}'

JSON.parse(json, (k, v) => max = v > max ? v : max)

console.log( max )

Для объекта JavaScript:

const d = { "A": [ {"value": 10}, {"value": 20}, {"value":   30 } ],
            "B": [ {"value": 50}, {"value": 60}, {"value": 1000 } ] }

console.log( Math.max(...Object.values(d).flat().map(x => x.value)) )
0 голосов
/ 18 июня 2019

Поскольку ни Array.flat , ни Array.flatMap хорошо не поддерживаются без полизаполнения, здесь есть решение с Array.reduce , Object.values и Array.map :

const d = {
"A": [ {"value": 10}, {"value": 20}, {"value": 30} ],
"B": [ {"value": 50}, {"value": 60}, {"value": 1000} ],
}

let r = Math.max(...Object.values(d).reduce((r,c)=>[...r,...c]).map(x => x.value))

console.log(r)

Идея состоит в том, чтобы использовать Object.values, чтобы перейти прямо к значениям объекта. Затем используйте Array.reduce для выравнивания массивов и Array.map для извлечения value. Затем распространите на Math.max для окончательного результата.

0 голосов
/ 18 июня 2019

Вы можете использовать старый добрый цикл

let d = {
"A": [ {"value": 10}, {"value": 20}, {"value": 30} ],
"B": [ {"value": 50}, {"value": 60}, {"value": 1000} ],
}

let maxValue;
for (let key in d)
{
  for (let i = 0, len = d[key].length; i < len; ++i)
  {
    if (maxValue === undefined || maxValue < d[key][i].value)
      maxValue = d[key][i].value;
  }
}

console.log(maxValue);
0 голосов
/ 18 июня 2019

d = {
    "A": [{ "value": 10 }, { "value": 20 }, { "value": 30 }],
    "B": [{ "value": 50 }, { "value": 60 }, { "value": 1000 }],
}


var maxValue = Math.max.apply(null,Object.keys(d).map(key => Math.max.apply(null,d[key].map(x => x.value))));

console.log(maxValue);
0 голосов
/ 18 июня 2019

Попробуйте что-то вроде этого, сначала сгладив значения, затем отсортировав их в порядке возрастания и выбрав последний элемент из отсортированного массива:

const data = {
		"A": [ {"value": 10}, {"value": 20}, {"value": 30 } ],
		"B": [ {"value": 50}, {"value": 60}, {"value": 1000} ],
};


const highestValue = Object.values(data)
.flatMap(x => x)
.sort((a, b) => a.value - b.value)
.slice(-1);

console.log(highestValue);
0 голосов
/ 18 июня 2019

Если вам нужен код es5, попробуйте это:

var d = {
"A": [ {"value": 10}, {"value": 20}, {"value": 30} ],
"B": [ {"value": 50}, {"value": 60}, {"value": 1000} ],
};

var results = [];
for(var key in d)
{
    d[key].forEach(function (obj){
        results.push(obj.value);
    });
}
console.log(Math.max.apply(null, results));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...