想要显示数组中所有最大 'levelNumber' 个对象

want to display all maximum 'levelNumber' of objects in an array

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 代码来获取重复的最大值对象

可以先求出数组中所有对象的最大层数,然后过滤数组

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);

    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);

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

等效的对象

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 在评论中提到的:

if I add one more object in the array, with name = 'raks & levelNumber = '4' then it should display maximum levelNumber wrt that particular name. i.e. { "levelNumber": "3", "name": "abc" }, { "levelNumber": "4", "name": "raks" }

要做到这一点,您必须:

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

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);

您可以使用 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)