如何基于项目数组减少数组对象

时间:2020-06-12 10:16:52

标签: javascript node.js arrays

如何根据匹配ID的数组将以下对象数组(packageMap)转换为名称字符串

我以为它是过滤器和地图的组合,但我听不懂!

    const packageMap = [
    {
      id: `g3IbvxHPGt4xUVfYK`,
      name: `Package 1 - Cost £10`
    },
    {
      id: `HPGKCapDCJS76sgd7`,
      name: `Package 2 - Cost £20`
    },
    {
      id: `jbd73hndxJH6U6j6s`,
      name: `Package 3 - Cost £1`
    },
    {
      id: `5F53DSndxJH6nns22`,
      name: `Package 3 - Cost £5`
    }
  ];

  const matchingIDs = ['5F53DSndxJH6nns22', 'HPGKCapDCJS76sgd7'];

如果我能以某种方式从packageMap获得一个名称数组,看起来像这样

let packages = ['Package 3 - Cost £5', 'Package 2 - Cost £20']

然后我可以在packages上使用join

let joined = packages.join(' and ')

let outStr = `You are subscribed to ${joined}`

console.log(outStr)

// "You are subscribed to Package 3 - Cost £5 and Package 2 - Cost £20"

我使用的是node,因此不受旧浏览器或类似内容的限制,因此最新版本的答案很好。

3 个答案:

答案 0 :(得分:4)

packageMap.filter(({ id }) => matchingIDs.includes(id)).map(({ name }) => name)

答案 1 :(得分:2)

这将起作用:

const packageMap = [
  {
    id: `g3IbvxHPGt4xUVfYK`,
    name: `Package 1 - Cost £10`
  },
  {
    id: `HPGKCapDCJS76sgd7`,
    name: `Package 2 - Cost £20`
  },
  {
    id: `jbd73hndxJH6U6j6s`,
    name: `Package 3 - Cost £1`
  },
  {
    id: `5F53DSndxJH6nns22`,
    name: `Package 3 - Cost £5`
  }
];

const matchingIDs = ['5F53DSndxJH6nns22', 'HPGKCapDCJS76sgd7'];

let packages = matchingIDs.map(x => packageMap.find(y => y.id == x).name)

console.log(packages)

答案 2 :(得分:1)

使用reduceincludes

const packageMap = [
  {
    id: `g3IbvxHPGt4xUVfYK`,
    name: `Package 1 - Cost £10`,
  },
  {
    id: `HPGKCapDCJS76sgd7`,
    name: `Package 2 - Cost £20`,
  },
  {
    id: `jbd73hndxJH6U6j6s`,
    name: `Package 3 - Cost £1`,
  },
  {
    id: `5F53DSndxJH6nns22`,
    name: `Package 3 - Cost £5`,
  },
];

const matchingIDs = ["5F53DSndxJH6nns22", "HPGKCapDCJS76sgd7"];

const names = packageMap.reduce(
  (acc, { id, name }) => (matchingIDs.includes(id) ? [...acc, name] : acc),
  []
);

console.log(names);