json 在2级对象数组中查找具有特定字符串的属性的最常见匹配项

hts6caw3  于 2022-12-01  发布在  其他
关注(0)|答案(1)|浏览(142)

我正在开发一个MOBA英雄计数器应用程序,我需要为一个团队找到一个英雄的常见计数器。
我有这样的东西:

[
    {
        "counters": [{"name": "a"}, {"name": "b"}, {"name": "k"}]
    },
    {
        "counters": [{"name": "a"}, {"name": "b"}, {"name": "y"}]
    },
    {
        "counters": [{"name": "a"}, {"name": "b"}, {"name": "c"}]
    },
    {
        "counters": [{"name": "a"}, {"name": "g"}, {"name": "f"}]
    },
    {
        "counters": [{"name": "x"}, {"name": "z"}, {"name": "y"}]
    }
]

我需要做的是找出最常见的具有相同name属性的计数器,并将它们显示在列表的顶部。因此,如果name: "a"重复3次,我希望能够按它排序并将其显示在列表的顶部。
问题是,我不知道如何做到这一点。有人能帮我吗?
这是我目前所掌握的情况:

const generateCounters = (hero) => {
  const positiveCounters = hero.counters.filter((counter) => parseFloat(counter.disadvantage.replace('%', '')) >= 0.00);
    
  return positiveCounters.map(counter => {
    return (
      <div className="relative-el">
        <img className="hero-image" src={`/assets/images/${replaceHeroName(counter.name)}.png`} alt="" width={86} />
        <p className="absolute-statistic">{counter.disadvantage}</p>
      </div>
    );
  });
}
    
const renderCounters = () => {
  return activeHeroes.map(hero => {
    return (
      <div className="hero-counters-container">
        <div className="relative-el header-hero">
          <img className="hero-image" src={`/assets/images/${hero.heroName.replaceAll(' ', "-").replace("'", "").toLowerCase()}.png`} alt="" width={86} />
        </div>
        <div className="counters-list">
          {generateCounters(hero)}
        </div>
      </div>
    );
  });
}

编辑:activeHeroes是保存上述json结构的变量。

lqfhib0f

lqfhib0f1#

我 * 认为 * 这是你想要的。我不得不改变你的输入数据,因为你的输入和你想要的输出是一样的,所以改变是不可见的。我相信它应该在render中的activeHeros .map调用之前运行。
第一个
这里我们有一个函数sortCounters,它接受一个heros(?)数组,即具有counters数组属性的对象,其中包含具有name属性的项。我们使用countBy帮助器创建一个索引,如下所示:

{a: 1, k: 3, q: 4, y: 1, w: 1, b: 1, p: 1, d: 1, e: 1, f: 1}

然后我们复制每个英雄,根据列表中的计数对其计数器进行排序。如果它们相同,我们不在乎,但大多数(所有?)现代JS引擎实现了一个稳定的排序,这意味着如果它们都相同,它们不会被重新排序。如果需要,我们可以很容易地添加一个按名称或其他方式的二级排序。

相关问题