【问题标题】:Get max value from each column in Javascript?从Javascript中的每一列获取最大值?
【发布时间】:2020-10-05 04:10:26
【问题描述】:

我正在使用 Javascript。我有一个对象数组。每个对象看起来都像这样

{
    date: Mon Oct 31 2016 19:00:00 GMT-0500 (Central Daylight Time), 
    Catan: 62588, 
    Dominion: 51915, 
    Codenames: 21263, 
    Terraforming Mars: 2148
}

如何从第 2-5 列中获取最大数量的数组??

【问题讨论】:

  • 您能具体说明一下您的要求吗?
  • 我的对象数组中的对象代表数据行。每个对象的每个键代表一列。第 2 到 5 列:Catan、Dominion、Codenames、Terraformin Mars。我正在尝试获取一个包含 4 个数字的数组,每个数字代表该列的最大值。
  • 所以你想要一个数组中所有这些列的最大值?

标签: javascript


【解决方案1】:

首先你映射以从 col2-5 中为每个对象获取值数组,然后减少它以找到对应列的最大值

const data = [
  {
    date: "Mon Oct 31 2016 19:00:00 GMT-0500 (Central Daylight Time)",
    Catan: 62588,
    Dominion: 51915,
    Codenames: 21263,
    "Terraforming Mars": 2148,
  },
  {
    date: "Mon Oct 31 2016 20:00:00 GMT-0500 (Central Daylight Time)",
    Catan: 9561,
    Dominion: 74152,
    Codenames: 5123,
    "Terraforming Mars": 1078,
  },
  {
    date: "Mon Oct 31 2016 21:00:00 GMT-0500 (Central Daylight Time)",
    Catan: 62588,
    Dominion: 84102,
    Codenames: 96396,
    "Terraforming Mars": 6423,
  },
]

const res = data
  .map((obj) => Object.values(obj).slice(1, 5))
  .reduce((acc, el) => acc.map((max, i) => Math.max(max, el[i])), [0, 0, 0, 0])

console.log(res)

【讨论】:

    【解决方案2】:

    要从您的对象中获取最大值,请尝试以下操作:

    let foo = {
        date: "Mon Oct 31 2016 19:00:00 GMT-0500 (Central Daylight Time)", 
        Catan: 62588, 
        Dominion: 51915, 
        Codenames: 21263, 
        "Terraforming Mars": 2148
    };
    let arr = Object.keys(foo).map(function(key) { return foo[key] });
    arr.shift()
    let max = Math.max.apply(null, arr);
    console.log(max); // prints 62588
    

    请注意,我必须对您最初发布的对象进行一些更改,因为它不是有效的 javascript。

    Fast way to get the min/max values among properties of object

    【讨论】:

    • 我有一个对象数组。 [{}、{}、{}、...]
    • Gotcha - 这为您提供了可以对数组中的每个对象执行的操作,只需要迭代。 @hgb123 上面的回答看起来不错。
    【解决方案3】:

    不是 100% 确定我理解这个要求,但如果您正在寻找数组中保存的对象的最大值,这样的方法可能会起作用。

    let dataArray = [
    {ID: "object1", firstValue:7, secondValue:1},
    {ID: "object2", firstValue:3, secondValue:10}
    ]
    
    let maxFirstValue = 0;
    let maxSecondValue = 0;
    
    for (let i = 0; i< dataArray.length; i++){
      if (dataArray[i].firstValue > maxFirstValue) {maxFirstValue = dataArray[i].firstValue}
      if (dataArray[i].secondValue > maxSecondValue) {maxSecondValue = dataArray[i].secondValue}
    }
    
    let resultsObject = {firstValue: maxFirstValue, secondValue: maxSecondValue}
    
    console.log(resultsObject);

    【讨论】:

      【解决方案4】:

      let foo = [{
      date: "Mon Oct 31 2016 19:00:00 GMT-0500 (Central Daylight Time)", 
      Catan: 0, 
      Dominion: 1, 
      Codenames: 2, 
      "Terraforming Mars": 3
      },
      {
      date: "Mon Oct 31 2016 19:00:00 GMT-0500 (Central Daylight Time)", 
      Catan: 3, 
      Dominion: 2, 
      Codenames: 1, 
      "Terraforming Mars": 0
      }
      ];
      foo = foo.map(column => {
         let keys = Object.keys(column);
         let max = -1;
         let targetKey = '';
         keys.forEach(( keyName, index ) => {
             if(index > 0){
               if(column[keyName] > max){
                  max = column[keyName];
                  targetKey = keyName;
               }
             }
         })
         return {value: max, key: targetKey}
      });
      console.log("foo", foo);

      如果这有帮助,请告诉我。

      预期结果

      [
       {
        value: 3,
        key: "Terraforming Mars"
       },
       {
        value: 3,
        key: "Catan"
       }
      ]
      

      【讨论】:

        【解决方案5】:
        function getColumns(object){
            //columns:
            const columns = [];
            
            const keys = Object.keys(object[Object.keys(object)[0]]);
            keys.forEach(key => columns.push([]));
            /* keys.shift(); //because you don't want the "date" */
            
            let i = 0; // to move between the arrays of "columns"
            for(id in object){
                keys.forEach(key => {
                    console.log(i, key, object[id][key]);
                    columns[i].push(object[id][key]);
                    i++;
                })
                console.log("-----------");
                i = 0;
            }
            
            return columns;
            }
            
            function MathMaxes(array){
                //is a private function for you <3
                const result = array.map(column=> Math.max(...column));
                return result;
            }
        
        //the testing object
        const data = {
            1:{
                date: "Mon Oct 31 2016 19:00:00 GMT-0500 (Central Daylight Time)", 
                Catan: 23432, 
                Dominion: 2233, 
                Codenames: 111, 
                "Terraforming Mars": 2344
            },
            2:{
                date: "Mon Oct 31 2016 19:00:00 GMT-0500 (Central Daylight Time)", 
                Catan: 1123, 
                Dominion: 353, 
                Codenames: 54645, 
                "Terraforming Mars": 2333
            },
            3:{
                date: "Mon Oct 31 2016 19:00:00 GMT-0500 (Central Daylight Time)", 
                Catan: 34673, 
                Dominion: 34532, 
                Codenames: 6457, 
                "Terraforming Mars": 1231
            }
        }
        
        
        const columns = getColumns(data);
        columns.shift(); //because you don't want the dates
        const theMaxes = MathMaxes(columns);
        console.log(theMaxes);
        

        【讨论】:

          猜你喜欢
          • 2013-10-25
          • 2012-10-29
          • 1970-01-01
          • 2017-06-11
          • 1970-01-01
          • 2021-11-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多