Учитывая массив объектов, я хочу вернуть объект с самыми высокими значениями из всех объектов.

let countObj = [{2:1},{2:4, 5:1},{3:3}]
let finalObj = {}
let primes = [2,3,5]
// finalObj should return {2:4, 3:3, 5:1}

Я чувствую, что должен быть какой-то способ использовать массив простых чисел и уменьшить количество countObj, чтобы получить желаемый результат.

primes.forEach(p => countObj.reduce((a,b) =>{
                 if (a[p]){ //if prime no. exists as key in a
                      a[p] > b[p] ? //keep key/val pair in a : replace key/val pair
                    }else{ //if new prime is not a key in a
                      a[p] = b[p]
                    }    
               },{})

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

1
OctaviaLo 12 Янв 2017 в 16:01

3 ответа

Лучший ответ

Вы можете проверить, больше ли сохраненное значение, чем фактическое значение, а если нет, то присвоить значение результирующему набору.

var countObj = [{ 2: 1 }, { 2: 4, 5: 1 }, { 3: 3 }],
    finalObj = {};

countObj.forEach(o => Object.keys(o).forEach(k => finalObj[k] > o[k] || (finalObj[k] = o[k])));

console.log(finalObj); // { 2:4, 3: 3, 5: 1 }

С primes

var countObj = [{ 2: 1 }, { 2: 4, 5: 1 }, { 3: 3 }],
    finalObj = {},
    primes = [2, 3, 5]

countObj.forEach(o => primes.forEach(k => k in o && (finalObj[k] > o[k] || (finalObj[k] = o[k]))));

console.log(finalObj); // { 2:4, 3: 3, 5: 1 }
2
Nina Scholz 12 Янв 2017 в 13:25

Вы можете использовать вложенный foreach как этот.

В этом случае вам не нужно primes[]

let countObj = [{
  2: 1
}, {
  2: 4,
  5: 1
}, {
  3: 3
}];
let finalObj = {};
let primes = [2, 3, 5];

countObj.forEach(function(obj) {
  Object.keys(obj).forEach(function(key) {
    var finalObjValue = finalObj[key] || 0;
    if(obj[key] > finalObjValue)
      finalObj[key] = obj[key];
  });
});

console.log(finalObj);
0
Weedoze 12 Янв 2017 в 13:11

Будьте осторожны с вашими тестами: 0 равно пропущенному значению. А при использовании reduce вы должны вернуть объект-аккумулятор.

Я бы уменьшил на объектах вместо того, чтобы уменьшить на простых:

let finalObj = countObj.reduce((f, o)=>{
    primes.forEach(k=>{
       if (k in o && !(o[k]<f[k])) f[k]=o[k];
    });
    return f;
}, {});
2
Denys Séguret 12 Янв 2017 в 13:30