【问题标题】:want to display all maximum 'levelNumber' of objects in an array想要显示数组中对象的所有最大 'levelNumber'
【发布时间】:2021-12-01 15:54:45
【问题描述】:
arr1 = [
{
    "levelNumber": "2",
    "name": "abc",
},
{
    "levelNumber": "3",
    "name": "abc"
},
{ 
    "levelNumber": "3",
    "name": "raks",
}
]

我的结果数组应该有最大 levelNumber 的对象,在这种情况下为 3。

它应该看起来像:

resultArr = [
{
    "levelNumber": "3",
    "name": "abc"
},
{ 
    "levelNumber": "3",
    "name": "raks",
}
]

注意这里的 levelNumber 可以是任何东西.. 请帮助我使用通用 nodejs 代码来获取重复的最大值对象

【问题讨论】:

  • 您是否在寻找最大值并且应该重复?还是应该是最大值?

标签: javascript node.js arrays typescript reduce


【解决方案1】:

可以先找到数组中所有对象的最大级别,然后过滤数组

arr1 = [
{
    "levelNumber": "2",
    "name": "abc",
},
{
    "levelNumber": "3",
    "name": "abc"
},
{ 
    "levelNumber": "3",
    "name": "raks",
}
]
const maxLevel = String(Math.max(...arr1.map(obj => Number(obj.levelNumber))))
const maxLevelObjects = arr1.filter(obj => obj.levelNumber === maxLevel)
console.log(maxLevelObjects);

【讨论】:

  • “字符串”类型的参数不可分配给“数字”类型的参数。ts(2345)
  • 它给了我这个问题
  • 更新帖子以转换为 Number 以避免 ts 错误
  • @nat 如果您使用的是 TS,则将 levelNumber 转换为数字,然后再将其传递给 Math.max。像这样const maxLevel = String(Math.max(...arr1.map(obj => +obj.levelNumber)))
  • 是的@transGLUKator 看到我上面的答案。
【解决方案2】:

const data = [
    {
        "levelNumber": "2",
        "name": "abc",
    },
    {
        "levelNumber": "3",
        "name": "abc"
    },
    { 
        "levelNumber": "3",
        "name": "raks",
    }
];

const levelNumbers = data.map((item) => parseInt(item.levelNumber));
const maxLevelNumber = Math.max(...levelNumbers).toString();

const highestLevelItems = data.filter((item) => item.levelNumber == maxLevelNumber);
console.log(highestLevelItems);

/* output
  [
    { levelNumber: '3', name: 'abc' },
    { levelNumber: '3', name: 'raks' }
  ]
*/

编辑

正如@nat 在评论中提到的:

如果我在数组中再添加一个对象,name = 'raks & levelNumber = '4' 那么它应该显示该特定名称的最大 levelNumber。 IE。 { "levelNumber": "3", "name": "abc" }, { "levelNumber": "4", "name": "raks" }

要实现这一点,您必须:

  1. 创建一个Set 的名字
  2. 创建一个单独的空数组来保存最终结果
  3. 对每个名称重复上述过程并将结果添加到数组中
  4. 返回完整结果

const data = [
    {
        "levelNumber": "2",
        "name": "abc",
    },
    {
        "levelNumber": "3",
        "name": "abc"
    },
    { 
        "levelNumber": "3",
        "name": "raks",
    },
    { 
        "levelNumber": "4",
        "name": "raks",
    },
    { 
        "levelNumber": "5",
        "name": "raks",
    }
];

// 1.
const names = new Set(data.map((item) => item.name)); // Set is used to get only unique items

// 2.
const result = []; // For normal JS
// const result: Array<{levelNumber: string, name: string}> = []; // For TS

// 3.
names.forEach((name) => {
    /* minify data (filter items with only particular name) e.g. [{levelNumber: '2', name: 'abc'}, {levelNumber: '3', name: 'abc'}] */
    const minifiedData = data.filter((item) => item.name === name);

    /* same process, now for minified array */
    const levelNumbers = minifiedData.map((item) => parseInt(item.levelNumber));
    const maxLevelNumber = Math.max(...levelNumbers).toString();

    minifiedData.forEach((item) => {
        if (item.levelNumber == maxLevelNumber)
            result.push(item);  // push every matching item (item with highest level) in final result
    });
});

// 4.
console.log(result);

【讨论】:

  • “字符串”类型的参数不可分配给“数字”类型的参数。ts(2345) const levelNumbers: string[]
  • 它在答案代码下方给出了这个错误
  • 好的,所以你正在使用打字稿。我也更新了在 TS 中工作的答案!
  • 非常感谢!你已经给出了解释!
  • 已经完成.. 再次感谢!看起来我不能投票,因为我需要一些最低的声誉!
【解决方案3】:

    const arr1 = [
      {
        levelNumber: '2',
        name: 'abc',
      },
      {
        levelNumber: '3',
        name: 'abc',
      },
      {
        levelNumber: '3',
        name: 'raks',
      },
    ];
    
    const getHighLevelElements = (array) => {
      if (array.length === 0) return null;
      array.sort((elem1, elem2) => {
        if (Number(elem1.levelNumber) < Number(elem2.levelNumber)) {
          return 1;
        }
        if (Number(elem1.levelNumber) > Number(elem2.levelNumber)) {
          return -1;
        }
        return 0;
      });
    
      return array.filter((elem) => elem.levelNumber === array[0].levelNumber);
    };
    
    const resultArr = getHighLevelElements([...arr1]);
    console.log(resultArr);

【讨论】:

  • 它显示所有三个为什么? @Lior Kamisnky
  • 它只显示 levelNumber: 3 个元素 - 尝试运行代码 sn -p
【解决方案4】:

我将首先有一个名为highestLevel 的变量来存储在对象数组中找到的最高级别数(稍后将在循环时使用),循环遍历整个数组并检查每个键 levelNumber 并存储该数字 IF highestLevel 低于当前对象 levelNumber 的值。 在我遍历数组并获得实际的 highestLevel 数字后,我将再次循环并仅获得与我的变量 highestLevel 等效的对象

【讨论】:

    【解决方案5】:

    您可以使用Array.prototype.reduce()arr1 进行一次迭代

    代码:

    const arr1 = [{levelNumber: '2',name: 'abc',},{levelNumber: '3',name: 'abc',},{levelNumber: '3',name: 'raks'}]
    
    const result = arr1.reduce((a, c) => !a.length || +c.levelNumber === +a[0].levelNumber 
      ? [...a, c] 
      : +c.levelNumber > +a[0].levelNumber 
        ? [c] 
        : a, 
    [])
    
    
    console.log(result)

    【讨论】:

    • 不错的解决方案,但根本没有效率,因为这一行 [...a, c] 将在每次迭代中复制整个现有数组
    猜你喜欢
    • 2013-03-13
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 2021-09-06
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多