【问题标题】:Find highest value from a key in a JavaScript object [duplicate]从 JavaScript 对象中的键中查找最大值 [重复]
【发布时间】:2016-06-26 14:46:50
【问题描述】:

我有以下对象:

var questions = [{
    'question_id': 245,
    'question': 'Question 1',
    'ordinal': 1,
    'master_difficulty': 1,
    'overridden_difficulty': ''
},{
    'question_id': 34,
    'question': 'Question 2',
    'ordinal': 2,
    'master_difficulty': 1,
    'overridden_difficulty': ''
},{
    'question_id': 656,
    'question': 'Question 3',
    'ordinal': 3,
    'master_difficulty': 1,
    'overridden_difficulty': ''
},{
    'question_id': 86,
    'question': 'Question 4',
    'ordinal': 4,
    'master_difficulty': 1,
    'overridden_difficulty': ''
}]

我想从中得到最高的序数值。

例如var highestOrdinal = highestOrdinalFunction(questions);

highestOrdinalFunction 将返回最高序数。

所以在这种情况下它会返回4

Math.max 可以为此工作吗?

【问题讨论】:

  • Math.max.apply(Math, questions.map(q => q.ordinal));
  • @Yoshi:应该将其发布为答案
  • @T.J.Crowder 我认为这个问题必须有很多重复项,所以我希望它很快就会关闭。
  • @Yoshi:这是一个公平的观点,Ahbap 也已经为我们找到了。

标签: javascript


【解决方案1】:

您可以通过两种方式找到最大值。您可以传递一个函数来映射属性的值,也可以直接在项目上调用该属性。这些结果将是应用于 Math.max 计算的映射值,与项目列表相关。

Math.prototype.max

var questions = [
  {'question_id':245,'question':'Question 1','ordinal':1,'master_difficulty':1,'overridden_difficulty':''},
  {'question_id':34,'question':'Question 2','ordinal':2,'master_difficulty':1,'overridden_difficulty':''},
  {'question_id':656,'question':'Question 3','ordinal':3,'master_difficulty':1,'overridden_difficulty':''},
  {'question_id':86,'question':'Question 4','ordinal':4,'master_difficulty':1,'overridden_difficulty':''}
]

document.body.innerHTML =  'Via Function: ' + highestOrdinalValueFn(questions) + '\n';
document.body.innerHTML += 'Via Property: ' + highestOrdinalValueProp(questions);

// #1 : Via function
function highestOrdinalValueFn(items) {
  return max(items, function() {
    return this.ordinal;
  });
}
// #2 : Via property
function highestOrdinalValueProp(items) {
  return max(items, 'ordinal');
}

function max(list, prop) {
  return Math.max.apply(Math, list.map(function(item) {
    return isFunction(prop) ? prop.call(item) : item[prop];
  }));
}

function isFunction(fn) {
  return fn && {}.toString.call(fn) === '[object Function]';
}
body { white-space: pre; font-family: monospace; }

Array.prototype.reduce

var questions = [
  {'question_id':245,'question':'Question 1','ordinal':1,'master_difficulty':1,'overridden_difficulty':''},
  {'question_id':34,'question':'Question 2','ordinal':2,'master_difficulty':1,'overridden_difficulty':''},
  {'question_id':656,'question':'Question 3','ordinal':3,'master_difficulty':1,'overridden_difficulty':''},
  {'question_id':86,'question':'Question 4','ordinal':4,'master_difficulty':1,'overridden_difficulty':''}
]

document.body.innerHTML = highestValue(questions, 'ordinal');

function highestValue(items, prop) {
  return compare(items, function(curr, prev) {
    return maxNumericComparator(curr, prev, prop);
  })[prop];
}

function maxNumericComparator(curr, prev, prop) {
  if (curr && !prev) return -1;
  if (!curr && prev) return 1;
  if (curr[prop] && !prev[prop]) return -1;
  if (!curr[prop] && prev[prop]) return 1;
  if (curr[prop] > prev[prop]) return -1;
  if (curr[prop] < prev[prop]) return 1;
  return 0;
};

function compare(list, comparator) {
  return list.reduce(function(max, item) {
    return comparator(item, max) < 0 ? item : max;
  }, null);
}

【讨论】:

    【解决方案2】:

    我想这就是你要找的:

    Math.max.apply(Math,questions.map(function(ques){return ques.ordinal;}))

    请参阅Array.prototype.map 了解有关 map() 工作原理的更多信息。

    【讨论】:

      【解决方案3】:

      Array#reduce (spec | MDN) 是这样做的惯用方式:

      function highestOrdinalFunction() {
          return questions.reduce(function(previous, entry) {
              return previous === undefined || entry.ordinal > previous ? entry.ordinal : previous;
          }, undefined);
      }
      

      Array#reduce 反复调用回调,传入回调的前一个返回值,该返回值以reduce 的第二个参数为种子。这个东西通常被称为reduce操作的“累加器”。 reduce 的结果是累加器的最终值。

      如果questions 为空,则上面将返回undefined

      【讨论】:

      • 如果序数值出现在-2-infinity 之间怎么办?
      • @RajaprabhuAravindasamy:好点!!
      • @RajaprabhuAravindasamy:已修复。
      【解决方案4】:

      我们可以按ordinal 值对该数组中的对象进行排序,然后返回第一个条目。

      function highestOrdinalFunction( questions ) {
          return questions.sort( ( a, b ) => a.ordinal - b.ordinal )[ 0 ].ordinal;
      }
      

      在这种情况下,将Array.prototype.mapMath.max() 结合起来可能会更好:

      Math.max.apply( null, questions.map(q => q.ordinal) );
      

      【讨论】:

      • 排序是一项可怕的工作,只是为了找到最高的。
      • 你是对的 TJ,math.max 似乎更适合。
      猜你喜欢
      • 2014-08-21
      • 1970-01-01
      • 2023-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多