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

JavaScript循环遍历数组,删除每个值的重复项,然后使用该值和另一个值推送到新数组,javascript,arrays,vue.js,duplicates,indexof,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++) {

我有一个通过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
  })
}
排序仍然有效,但它将对一个大的一维数组进行排序。相位阵列如下所示:

{ "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
    }
]
您可以使用一个,然后将项目放入只包含
id
phase\u编号
的新对象中,然后使用
phase\u编号
,使数组只具有唯一性:

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
}
还可以使用and,然后将迭代器扩展到数组

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
}
您可以使用一个,然后将项目放入只包含
id
phase\u编号
的新对象中,然后使用
phase\u编号
,使数组只具有唯一性:

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
}
还可以使用and,然后将迭代器扩展到数组

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
}

一种解决方案是更新代码以推送整个相位对象,而不仅仅是相位编号,然后使用数组
find
方法而不是
indexOf
,检查是否找到具有给定编号的相位

试试这个:

salesPhases () {
  let phases = this.$store.state.addresses.salesPhases
  let uniquePhases = []
  for (let i = 0; i < phases.length; i++) {
    if (!uniquePhases.find(x => x.phase_number === phases[i].phase_number)) {
      uniquePhases.push(phases[i])
    }
  }
  return uniquePhases.sort((a, b) => {
    return a.phase_number - b.phase_number
  })
}
salesphages(){
let phases=this.$store.state.addresses.salesPhases
让uniquePhases=[]
for(设i=0;ix.phase\u number===phases[i].phase\u number)){
uniquePhases.push(阶段[i])
}
}
返回uniquePhases.sort((a,b)=>{
返回a.相位号-b.相位号
})
}

一种解决方案是更新代码以推送整个相位对象,而不仅仅是相位号,然后使用数组
find
方法而不是
indexOf
,检查是否找到具有给定编号的相位

试试这个:

salesPhases () {
  let phases = this.$store.state.addresses.salesPhases
  let uniquePhases = []
  for (let i = 0; i < phases.length; i++) {
    if (!uniquePhases.find(x => x.phase_number === phases[i].phase_number)) {
      uniquePhases.push(phases[i])
    }
  }
  return uniquePhases.sort((a, b) => {
    return a.phase_number - b.phase_number
  })
}
salesphages(){
let phases=this.$store.state.addresses.salesPhases
让uniquePhases=[]
for(设i=0;ix.phase\u number===phases[i].phase\u number)){
uniquePhases.push(阶段[i])
}
}
返回uniquePhases.sort((a,b)=>{
返回a.相位号-b.相位号
})
}

我会利用lodash来实现这一点:


我会利用lodash来实现这一点:



能否提供添加到主帖子中的阶段的示例?是否确实要将数据存储在数组中,例如[phase_number,id]?我的猜测是,最好推送({phase_number:phases[i].phase_number,id:phases[i].id})无效的json。。。你有两个“id”属性。不是这样,我只是在这里更改了行。它们有不同的键。能否提供一个示例,说明哪些阶段包含?添加到主帖子^^^^^^是否确实要将数据存储在数组中,例如[phase_number,id]?我的猜测是,最好推送({phase_number:phases[i].phase_number,id:phases[i].id})无效的json。。。你有两个“id”属性。不是这样,我只是在这里更改了行。它们有不同的键。我认为由于集合无论如何都是唯一的,因此不需要进行.has()检查,但可能ES6 Map obj更合适。我使用集合来检查在筛选数组时是否已经存在id。我不会因此而把布景还回去。太棒了!非常感谢。我还添加了一些键,但这是great@MattLarson-欢迎:)我添加了另一个使用Map和reduce的解决方案。非常灵活。我真的很感激!我认为,由于集合无论如何都是唯一的,因此不需要进行.has()检查,但ES6 Map obj可能更合适。我使用集合来检查在筛选数组时是否已经存在id。我不会因此而把布景还回去。太棒了!非常感谢。我还添加了一些键,但这是great@MattLarson-欢迎:)我添加了另一个使用Map和reduce的解决方案。非常灵活。我真的很感激!