Set.add仅添加1个项目

时间:2019-06-23 00:35:48

标签: javascript ecmascript-6 set

Set只添加一个数组的副本,我不确定为什么它不一直添加其他副本。

下面的函数接收一个包含旅行者ID的旅行数组,另一个包含旅行者ID和名称的数组。在这段代码中,

if(item.type === type){
      store.add(...item.travelers);
    }

我希望将123,456和789添加到集合中。但是,仅添加123和456。为什么Set不添加第二个副本(即456和789)?

const travelers = [
  {
  id: 123,
  name: 'John'
  },
  {
  id: 456,
  name: 'Raymond'
  },
  {
  id: 789,
  name: 'Mary'
  },
];


const trip = [
  {
    type: 'car',
    travelers: [123, 456]
  },
  {
    type: 'flight',
    travelers: []
  },
  {
    type: 'car',
    travelers: [456, 789]
  },
];


function determinePeopleForEachTripType(arr, travelers, type){
  const result = [];
  let store = new Set();

  for(let i = 0; i< arr.length; i++){
    let item = arr[i];
    if(item.type === type){
      store.add(...item.travelers);
    }
  }

  store.forEach(eachStore =>{
    for(let j = 0; j< travelers.length; j++){
      if(eachStore === travelers[j].id){
        result.push(travelers[j].name)
      }
    }
  })

  return result;
}

determinePeopleForEachTripType(trip, travelers, 'car');

预期结果:集合包含[123、456、789]。但是Set的实际输出包含[123,456]。有什么可能的方法来修复此代码?

2 个答案:

答案 0 :(得分:1)

Set.prototype.add仅接受一个参数,这就是一个元素-您需要分别遍历每个项目的entitytravellers

add

答案 1 :(得分:0)

const travelers = [
  {
  id: 123,
  name: 'John'
  },
  {
  id: 456,
  name: 'Raymond'
  },
  {
  id: 789,
  name: 'Mary'
  },
];


const trip = [
  {
    type: 'car',
    travelers: [123, 456]
  },
  {
    type: 'flight',
    travelers: []
  },
  {
    type: 'car',
    travelers: [456, 789]
  },
];


function determinePeopleForEachTripType(arr, travelers, type){
  const result = [];
  let store = new Set();

  for(let i = 0; i< arr.length; i++){
    let item = arr[i];
    if(item.type === type){
      for (let traveler of item.travelers) {
        store.add(traveler);
      }
    }
  }

  store.forEach(eachStore =>{
    for(let j = 0; j< travelers.length; j++){
      if(eachStore === travelers[j].id){
        result.push(travelers[j].name)
      }
    }
  })

  return result;
}

const result = determinePeopleForEachTripType(trip, travelers, 'car');

console.log(result)