当前位置: 首页 > 知识库问答 >
问题:

如何映射对象数组并将其返回为在"类别"中排序的对象的新数组[重复]

傅献
2023-03-14

我正在构建我的第一个react原生应用程序,我想向用户展示一些按类别划分的“追随者”屏幕,但要做到这一点,我想我必须从我拥有的东西中创建新的对象数组。

我有这样的对象数组:

followers: [
    {
      userId: 2,
      userName: "Abigail",
      followDate: "1980-04-09T10:15:30+07:00",
      category: "A"
    },
    {
      userId: 3,
      userName: "John",
      followDate: "1980-04-09T10:15:30+07:00",
      category: "B"
    },
    {
      userId: 4,
      userName: "Bob",
      followDate: "1980-04-09T10:15:30+07:00",
      category: "A"
    },
    {
      userId: 5,
      userName: "Martha",
      followDate: "1980-04-09T10:15:30+07:00",
      category: "B"
    } 
]

现在我想把这些追随者呈现给用户,这些追随者由追随者数组对象中的类别分开。因此,我认为我需要创建新的对象数组,我认为它应该如下所示:

followersSortedByCategory = [
      {
        category: "A",
        followers: [
          {
            userId: 2,
            userName: "Abigail",
            followDate: "1980-04-09T10:15:30+07:00",
            category: "A"
          },
          {
            userId: 4,
            userName: "Bob",
            followDate: "1980-04-09T10:15:30+07:00",
            category: "A"
          }
        ]
      },
      {
        category: "B",
        followers: [
          {
            userId: 3,
            userName: "John",
            followDate: "1980-04-09T10:15:30+07:00",
            category: "B"
          },
          {
            userId: 5,
            userName: "Martha",
            followDate: "1980-04-09T10:15:30+07:00",
            category: "B"
          }
        ]
      }
    ]

没有很多“如果”,我不确定如何做到这一点。我认为有一个很好的方法,使用地图,过滤器等功能,但我不知道如何做。

共有3个答案

万俟丁雷
2023-03-14

所有这些答案可能会使用减少,它们可能都一样好。但是他们都使用了微妙不同的数据迭代方法。这种方法使用对象键

let categories = Object.values(
// the final output will be an array
    data.followers.reduce( (b,a) => {
    // we iterate the followers and build the accumulator object
    if (b.hasOwnProperty(a.category)) b[a.category].followers.push(a)
    // if our accumulating object already has the category key, add to the follower array
    else b[a.category] = {category: a.category, followers: [a]}
    // otherwise create the object key and initialize it with the first follower
    return b
    },{}))
let data = {
  followers :[
  { userId: 2, userName: "Abigail", followDate: "1980-04-09T10:15:30+07:00", category: "A" },
  { userId: 3, userName: "John", followDate: "1980-04-09T10:15:30+07:00", category: "B" },
  { userId: 4, userName: "Bob", followDate: "1980-04-09T10:15:30+07:00", category: "A" },
  { userId: 5, userName: "Martha", followDate: "1980-04-09T10:15:30+07:00", category: "B" } 
]}

let categories = Object.values(data.followers.reduce( (b,a) => {
if (b.hasOwnProperty(a.category)) b[a.category].followers.push(a)
else b[a.category] = {category: a.category, followers: [a]}
return b
},{}))

console.log(categories)
逑景铄
2023-03-14
const followers = [
  { userId: 2, userName: "Abigail", followDate: "1980-04-09T10:15:30+07:00", category: "A" },
  { userId: 3, userName: "John", followDate: "1980-04-09T10:15:30+07:00", category: "B" },
  { userId: 4, userName: "Bob", followDate: "1980-04-09T10:15:30+07:00", category: "A" },
  { userId: 5, userName: "Martha", followDate: "1980-04-09T10:15:30+07:00", category: "B" } 
];

const followersSortedByCategory = [...
  // iterate over followers array while updating categoryMap (category-records)
  followers.reduce((categoryMap, follower) => {
    const { category } = follower;
    // get record of follower's category if exists
    const categoryRecord = categoryMap.get(category);
    if(!categoryRecord) { // if not, add new pair
      categoryMap.set(category, { category, followers: [follower] });
    } else { // else update the record's followers array
      categoryRecord.followers.push(follower);
    }
    return categoryMap;
  }, new Map)
  // return grouped list by categories
  .values()
];

console.log(followersSortedByCategory);
卓云
2023-03-14

较短的解决方案:

const followers = [
{
  userId: 2,
  userName: "Abigail",
  followDate: "1980-04-09T10:15:30+07:00",
  category: "A"
},
{
  userId: 3,
  userName: "John",
  followDate: "1980-04-09T10:15:30+07:00",
  category: "B"
},
{
  userId: 4,
  userName: "Bob",
  followDate: "1980-04-09T10:15:30+07:00",
  category: "A"
},
{
  userId: 5,
  userName: "Martha",
  followDate: "1980-04-09T10:15:30+07:00",
  category: "B"
} 
]

function formatFollowers(followers){
  const categories = [...new Set(followers.map(follower=> follower.category))]
   return categories.reduce((acc, category)=> {
     const _followers = followers.filter(follower=> follower.category === category)
    return [...acc, {category: category, followers: _followers}]
  }, [])
}

console.log(formatFollowers(followers))
 类似资料:
  • 我有一个对象数组: 寻找一个简单的一行返回: 因此,我可以很容易地泵到一个反应下拉与适当的键。 我觉得这个简单的解决方案应该可以工作,但是我得到了无效的语法错误:

  • 我有以下练习: 编写一个名为createListOfObjects的函数,该函数接受 包含名字和姓氏以及返回值的字符串数组 一个对象数组,每个对象都具有属性 和以及名字和姓氏值 对应值* var namesList=['Cameron Betts','Shana Lopez','Angela li']* createListOfObjects(名称列表) = 到目前为止,我的解决方案是: 但它返回

  • 我有一个对象数组。每个对象都有一个键“username”。 有没有一种快速的方法可以将这个对象数组按升序排序? 谢谢

  • 我正在尝试将我的对象[]数组映射并过滤到int[]数组。如果对象是int,效果很好,但如果不是int,则抛出强制转换异常。我想知道我是否可以在lambda表达式中附加一个try/catch?这是我的代码: 或者更好的方法是试着抓住整个街区?

  • 这是UML图中的实例方法: 此方法的目的是返回客户银行账户的所有汇总详细信息。 BankAccount是包含名称、帐户编号、余额和状态的类: 在BankManager类中,有一个实例变量: 方法),这将打印出所有的客户详细信息?

  • 我有一个回应 正文 下面是我要映射的coreV2Response类

  • 使用一个函数将数组的值映射到对象,其键值对中,原始值作为键,映射值作为值。 使用一个匿名的内部函数作用域来声明一个 undefined 的内存空间,使用闭包来存储返回值。 使用一个新的 Array 来存储带有函数映射的数组和一个逗号运算符来返回第二个步骤,而不需要从一个上下文移动到另一个上下文(由于闭包和操作顺序)。 const mapObject = (arr, fn) => (a => (

  • 我有一个Object数组,它声明如下所示: 我需要根据每个对象的第三个元素,然后根据第二个元素对这些对象进行排序。因此我的输出将是: