简体   繁体   English

React:按组件中的值按多维数组对象分组

[英]React: group by multidimensional array object by value in component

How to group multidimensional array objects by value in the component.如何在组件中按值对多维数组对象进行分组。

I need to group array by page and get the text for every page.我需要按页对数组进行分组并获取每一页的文本。 I tray to use the map and reduce it but don't get good results.我尝试使用地图并减少它,但没有得到好的结果。 I work on react-native project.我从事react-native项目。 JS function groups doesn't work for some reason. JS 函数组由于某种原因不起作用。

What is the best way to write code for this array?为这个数组编写代码的最佳方法是什么?

I have this array:我有这个数组:

[
  {
    number: 1,
    englishName: 'Name 1',
    items: [
      {
        text: 'Some text',
        page: 1,
      },
      {
        text: 'Some text',
        page: 1,
      },
    ],
  },
  {
    number: 2,
    englishName: 'Name 2',
    items: [
      {
        text: 'Some text',
        page: 2,
      },
      {
        text: 'Some text',
        page: 2,
      },
    ],
  },
  {
    number: 3,
    englishName: 'Name 3',
    items: [
      {
        text: 'Some text',
        page: 3,
      },
      {
        text: 'Some text',
        page: 4,
      },
    ],
  },
]

I need an array like this我需要一个这样的数组

[
  {
    'page 1': [
      {
        text: 'Some text',
        englishName: 'Name 1',
      },
      {
        text: 'Some text',
        englishName: 'Name 2',
      },
    ],
  },
  {
    'page 2': [
      {
        text: 'Some text',
        englishName: 'Name 2',
      },
      {
        text: 'Some text',
        englishName: 'Name 2',
      },
    ],
  },
  ....
]

Seems like this will work for you.看起来这对你有用。

This will give you an object:这会给你一个对象:

const allPages = array.reduce((acc, curr) => {
    curr.items.forEach((page) => {
        var pageKey = `page ${page.page}`
        if(!acc[pageKey]){
            acc[pageKey] = []
        }
        acc[pageKey].push({ text: page.text, englishName: curr.englishName })
    })
    return acc
}, {})

You can convert that object into an array as well:您也可以将该对象转换为数组:

const finalArr = Object.entries(allPages).map(([page, array]) => {
    return {
        [page]: array
    }
})

See example:见示例:

 var array = [{ "number": 1, "englishName": "Name 1", "items": [ { "text": "Some text", "page": 1, }, { "text": "Some text", "page": 1, } ] }, { "number": 2, "englishName": "Name 2", "items": [ { "text": "Some text", "page": 2, }, { "text": "Some text", "page": 2, } ] }, { "number": 3, "englishName": "Name 3", "items": [ { "text": "Some text", "page": 3, }, { "text": "Some text", "page": 4, } ] } ] const allPages = array.reduce((acc, curr) => { curr.items.forEach((page) => { var pageKey = `page ${page.page}` if(!acc[pageKey]){ acc[pageKey] = [] } acc[pageKey].push({ text: page.text, englishName: curr.englishName }) }) return acc }, {}) const finalArr = Object.entries(allPages).map(([page, array]) => { return { [page]: array } }) console.log(allPages) console.log(finalArr)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM