【问题标题】:Replacing similar items of an array from the objects value从对象值替换数组的相似项
【发布时间】:2022-11-10 15:53:53
【问题描述】:

下面有一个名为 cricket mania 的对象,由不同国家的净跑分和得分组成。我正在尝试用JS编写代码,首先根据他们的积分对球队进行排序,如果他们有相同的积分,则使用Net Run作为 决胜局。在我们的案例中,孟加拉国和尼泊尔得分相同,因此我们将考虑这两个国家的净运行,即孟加拉国的 -1.176 和尼泊尔的 -0.849。由于尼泊尔的净跑数最高,我们将尼泊尔的净跑数排在第一位。我已经对这些点进行了排序,但我无法弄清楚如何使用网络运行来替换相似的点。我需要以下数组登录到控制台 [ '3', '4', '5', '6', '-0.849', '-1.176' ].我肯定会感谢这个社区的人们花时间来解决我被困住的这个小疑问在这个学习过程中,如果有人能帮助我,我会非常高兴:)

This is the link to my codepen

``

    const cricketMania = {
    India: {
        netRuns: "1.319",
        points: "8"
    },
    Pakistan: {
        netRuns: "1.028",
        points: "6"
    },
    Saudi: {
        netRuns: "0.874",
        points: "5"
    },
    Nepal: {
        netRuns: "-0.849",
        points: "4"
    },
    Bangladesh: {
        netRuns: "-1.176",
        points: "4"
    },
    Zimbabwe: {
        netRuns: "-1.138",
        points: "3"
    }
};

var point = []; // [ '8', '6', '5', '8', '4', '3' ]
for (let m in cricketMania) {
    point.push(cricketMania[m]["points"]);
}

var sortedpoints = point.sort((a, b) => a - b);
document.write(sortedpoints); //[ '3', '4', '5', '6', '8', '8' ]

``

【问题讨论】:

  • 请花一些时间使您的要求和代码更清晰。您代码中的 cmets 与代码生成的实际值不匹配。由于孟加拉国和尼泊尔的值为 4,因此将他们的净跑分放在数组的末尾(得分较高的球队之后)没有意义。此外,您对所需输出的要求只会给您数字,大概您希望对整个团队的数据进行排序,对吗?

标签: javascript arrays object properties


【解决方案1】:

这不是最短的解决方案,但它可能会说明问题。

  1. 我们将对象转换为包含国家名称和其他值的数组。
  2. 然后我们按点对数组进行排序,然后按 netRuns(如果点相等)。

    排序也可以简化为像

    asArray.sort((a, b) => (a.points * 100 + a.netRuns) - (b.points * 100 + b.netRuns));
    

    我们用来相乘的常量应该大于最大值 b.netRuns 的模数。

    const cricketMania = {
        India: {
            netRuns: "1.319",
            points: "8"
        },
        Pakistan: {
            netRuns: "1.028",
            points: "6"
        },
        Saudi: {
            netRuns: "0.874",
            points: "5"
        },
        Nepal: {
            netRuns: "-0.849",
            points: "4"
        },
        Bangladesh: {
            netRuns: "-1.176",
            points: "4"
        },
        Zimbabwe: {
            netRuns: "-1.138",
            points: "3"
        }
    };
    
    const asArray = Object.entries(cricketMania).map(([key, val]) => ({
        name: key,
        netRuns: +val.netRuns,
        points: +val.points
    }));
    
    asArray.sort((a, b) => a.points > b.points ? 1 :
                    a.points < b.points ? -1 :
                    a.netRuns > b.netRuns ? 1 : 
                    a.netRuns < b.netRuns ? -1 : 0);
    console.log(asArray);

【讨论】:

  • 很好地解决了 OP 的问题并了解他们可能真正想做的事情。我相信排序可以简化为(a, b) =&gt; a.points - b.points || a.netRuns - b.netRuns,因为相等的点会产生一个虚假的 0。
【解决方案2】:

您可以借助 3 个 JS 函数简单地实现此要求,Object.values()Array.map()Array.sort() 具有比较功能。

现场演示:

const cricketMania = {
  India: {
    netRuns: "1.319",
    points: "8"
  },
  Pakistan: {
    netRuns: "1.028",
    points: "6"
  },
  Saudi: {
    netRuns: "0.874",
    points: "5"
  },
  Nepal: {
    netRuns: "-0.849",
    points: "4"
  },
  Bangladesh: {
    netRuns: "-1.176",
    points: "4"
  },
  Zimbabwe: {
    netRuns: "-1.138",
    points: "3"
  }
};

const res = Object.values(cricketMania).map(({ points }) => points).sort((a, b) => a - b);

console.log(res);

【讨论】:

    猜你喜欢
    • 2016-01-13
    • 2020-05-23
    • 1970-01-01
    • 2016-08-22
    • 2018-05-12
    • 2018-07-24
    • 2020-01-16
    • 1970-01-01
    • 2021-01-22
    相关资源
    最近更新 更多