首页 > 解决方案 > 如何将多个数组和一个字符串组合成一个数组?

问题描述

考虑以下对象:

const test = {
  resources: {
    gatewayApi: {
      resourceUri: 'https://bla',
      resourceScope: 'D',
    },
    msGraphProfile: {
      resourceUri: 'https://foo',
      resourceScope: ['A', 'B', 'C'],
    },
    msGraphMail: {
      resourceUri: 'https://bar',
      resourceScope: ['A'],
    },
    msGraphGroupMember: {
      resourceUri: 'https://bob',
    },
  },
}

目标是实现一个仅包含以下定义的唯一值的数组resourceScope

const result = ['A', 'B', 'C', 'D']

为了达到预期的结果,我采取了以下步骤:

// first create a new array with key value pairs
const newArray = Object.entries(test.resources)

// return only those values that have the property `resourceScope`
const result = newArray.filter(([, val]) => {
  if ('resourceScope' in val) { return val.resourceScope }
})

在这一点上,我有点卡住了。我需要将所有返回的数组和一个字符串 ('A') 组合成一个 clean array。我已经尝试寻找示例,但我无法真正弄清楚。

感谢您的帮助。

标签: javascript

解决方案


您可以使用reduce带有Set作为累加器值的方法来获取唯一值,然后从该集合创建一个数组。

const test = {"resources":{"gatewayApi":{"resourceUri":"https://bla","resourceScope":"D"},"msGraphProfile":{"resourceUri":"https://foo","resourceScope":["A","B","C"]},"msGraphMail":{"resourceUri":"https://bar","resourceScope":["A"]},"msGraphGroupMember":{"resourceUri":"https://bob"}}}

const uniq = Object
  .values(test.resources)
  .reduce((r, e) => {
    [].concat(e.resourceScope)
      .forEach(e => {
        if (e) r.add(e)
      })

    return r;
  }, new Set)


const result = Array.from(uniq)
console.log(result)


推荐阅读