首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回对象数组(来自对象数组)

返回对象数组(来自对象数组)
EN

Stack Overflow用户
提问于 2019-08-21 02:31:21
回答 2查看 72关注 0票数 2

我有以下数据,我想返回一个不同的years数组(对象)。

我尝试了下面的函数,但我在数组中得到了一个数组。

代码语言:javascript
复制
const data = [{
    id: 1,
    name: "test1",
    years: [{
      id: 1,
      name: "year1"
    }, {
      id: 2,
      name: "year2"
    }]
  },
  {
    id: 2,
    name: "test2",
    years: [{
      id: 1,
      name: "year1"
    }]
  },
]

let years = data.map((s) => {
  return s.years
})
let distinctYears = Array.from(new Set(years.map(c => c.id))).map(id => {
  return {
    id: id,
    name: years.find(c => c.id === id).name,
  }
})

console.log(distinctYears);

期望的结果:

代码语言:javascript
复制
[
  {id: 1, name: "year1"},
  {id: 2, name: "year2"}
]
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-21 02:41:19

因为s.years()是一个数组,而data.map()返回一个结果数组,所以years必须是一个数组数组。

使用.reduce()来连接它们,而不是使用.map()

代码语言:javascript
复制
const data = [{
    id: 1,
    name: "test1",
    years: [{
      id: 1,
      name: "year1"
    }, {
      id: 2,
      name: "year2"
    }]
  },
  {
    id: 2,
    name: "test2",
    years: [{
      id: 1,
      name: "year1"
    }]
  },
];

const years = data.reduce((a, {
  years
}) => a.concat(years), []);
let distinctYears = Array.from(new Set(years.map(c => c.id))).map(id => {
  return {
    id: id,
    name: years.find(c => c.id === id).name,
  }
});
console.log(distinctYears);

票数 2
EN

Stack Overflow用户

发布于 2019-08-21 02:48:06

你有很多方法可以做到这一点。这里有一个,它不是一行代码,但它被分解成几个部分,以帮助我们了解发生了什么。

您的数据集:

代码语言:javascript
复制
let data =
[
  {
    id: 1,
    name: "test1",
    years: [{id: 1, name: "year1"}, {id: 2, name: "year2"} ]
  },
  {
    id: 2,
    name: "test2",
    years: [{id: 1, name: "year1"} ]
  },
]

使用.flatMap()创建包含所有项的一级数组:

代码语言:javascript
复制
let allItems = data.flatMap((item) => {
    return item.years.map((year) => {
        return year
    })
})

获取不同的项目:

代码语言:javascript
复制
let distinct = []

allItems.forEach((item) => {
    let matchingItem = distinct.find((match) => match.id == item.id && match.name == item.name)

    if(!matchingItem){
        distinct.push(item)
    }
})

在实践中:

代码语言:javascript
复制
let data = [{
    id: 1,
    name: "test1",
    years: [{
      id: 1,
      name: "year1"
    }, {
      id: 2,
      name: "year2"
    }]
  },
  {
    id: 2,
    name: "test2",
    years: [{
      id: 1,
      name: "year1"
    }]
  },
]

let allItems = data.flatMap((item) => {
  return item.years.map((year) => {
    return year
  })
})

let distinct = []

allItems.forEach((item) => {
  let matchingItem = distinct.find((match) => match.id == item.id && match.name == item.name)

  if (!matchingItem) {
    distinct.push(item)
  }
})

console.log(distinct)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57579651

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档