JavaScript 遍历数组,删除每个值的重复项,然后使用该值和另一个值推送到新数组

标签 javascript arrays vue.js duplicates indexof

我有一个对象数组通过 api 调用进入我的 Vuejs 前端,我试图遍历、删除重复项,然后返回一个具有唯一“阶段”及其关联的“id”的新数组。原始数组有几个我不需要的其他键/值。我还按阶段编号对它们进行排序。这是我的代码:

salesPhases () {
  let phases = this.$store.state.addresses.salesPhases
  let uniquePhases = []
  for (let i = 0; i < phases.length; i++) {
    if (uniquePhases.indexOf(phases[i].phase_number) === -1) {
      uniquePhases.push(phases[i].phase_number)
    }
  }
  return uniquePhases.sort((a, b) => {
    return a - b
  })
}

上面的代码适用于我需要的一切,不包括 id。这是我这样做的尝试,然后否定了独特的阶段条件。

uniquePhases.push([phases[i].phase_number, phases[i].id])

排序仍然有效,但它正在对一个大的一维数组进行排序。阶段数组看起来像这样:

{ "data": [
    {
        "id": "94e224af-135f-af31-3619-535acfae9930",
        "street_address1": "407 48TH ST E",
        "street_address2": null,
        "phase": "101",
        "sales_rep": "164",
        "id": "abd90d6b-28a8-2be6-d6c1-abd9007aef38",
        "name": "48TH ST E",
        "block_minimum": 400,
        "block_maximum": 498,
        "side": 2
    },
    {
        "id": "94e224af-135f-af31-3619-535acfae9930",
        "street_address1": "407 48TH ST E",
        "street_address2": null,
        "phase": "101",
        "sales_rep": "164",
        "id": "abd90d6b-28a8-2be6-d6c1-abd9007aef38",
        "name": "48TH ST E",
        "block_minimum": 401,
        "block_maximum": 499,
        "side": 1
    }
]

最佳答案

您可以 filter使用 Set 获得唯一的数组, 然后 map将项目转换为仅包含 idphase_number 的新对象,然后是 sort通过 phase_number:

salesPhases () {
  const uSet = new Set()
  return this.$store.state.addresses.salesPhases
    .filter(({ phase_number }) => uSet.has(phase_number) ? false : uSet.add(phase_number)) // get uniques by phase_number
    .map(({ id, phase_number }) => ({ id, phase_number })) // get an object with the id and the phase_number
    .sort((a, b) => a.phase_number - b.phase_number) // sort by phase_number
}

您还可以使用 reduceMap , 然后传播 Map.values()数组的迭代器

salesPhases () {
  return [...this.$store.state.addresses.salesPhases
    .reduce((m, { id, phase_number }) => 
      m.has(phase_number) ? m : m.set(phase_number, { id, phase_number }), new Map()) // set to map, if phase_number key doesn't exist
    .values()] // convert the Map values to an array
    .sort((a, b) => a.phase_number - b.phase_number) // sort by phase_number
}

关于JavaScript 遍历数组,删除每个值的重复项,然后使用该值和另一个值推送到新数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48914841/

相关文章:

javascript - 需要识别 ASP.net 数据列表的单个记录中特定元素的 ID

javascript - 在数组的不存在索引上使用 concat

arrays - 未定义方法 `>' 对于 nil :NilClass in ruby array

vue.js - vue.js 什么时候使用生命周期方法 beforeMount?

javascript - 在 Vue.js 中单击时切换按钮颜色

javascript - 使用 jquery/javascript 使按钮可根据屏幕大小调整大小

javascript - Highcharts - 同步热图

java - 尝试解析数据时 for 循环中的 ArrayIndexOutOfBounds 异常

c - 从数组中读取两个字符作为C中的一个十六进制数

javascript - 如何使用 defineprop 和接口(interface)在 Vue 3 脚本设置中使用动态 Prop 类型