首页 > 解决方案 > 将两个变量加在一起/查找

问题描述

除非主题是相同的名称,否则它可以工作。然后我得到了第二个相同主题的第一个日期。

我无法更改数组,因为它是通过 API。但是,如果第一个日期已经设置在数学上,我可以以某种方式这样做,那么它应该将第二个日期添加到第二个主题吗?现在第二个主题得到第一次约会

var subjects = [
  { name: "math" }, //The first
  { name: "sports" },
  { name: "math" }, //The second
  { name: "art" },
];

var subjectdates = [
  { name: "math", year: 2017 }, //first date
  { name: "sports", year: 2018 },
  { name: "math", year: 2019 }, //second date
  { name: "art", year: 2020 },
];

const addDates = subjects.map((classes) => ({
  subject: classes,
  end_subject_date: subjectdates.find((item) => classes.name == item.name),
}));

console.log(addDates);

标签: javascriptarrays

解决方案


使用Array#reduceonsubjectdates构造 a Map,其中 thekey是 the name,值是 this 的元素列表name

然后,在循环中,要获取end_subject_date,您可以使用Map#get获取 this 的元素列表name,并Array#shift获取和删除第一个元素:

const 
  subjects = [ {name:"math"}, {name:"sports"}, {name:"math"}, {name:"art"} ],
  subjectdates = [ {name:"math",year:2017}, {name:"sports",year:2018}, {name:"math",year:2019}, {name:"art",year:2020} ];
  
const subjectDatesMap = subjectdates.reduce((map, item) => 
  map.set(
    item.name, 
    [...(map.get(item.name) || []), item]
  )
, new Map);

const addDates = subjects.map(classes => ({
  subject: classes,
  end_subject_date: (subjectDatesMap.get(classes.name) || []).shift()
}));
   
console.log(addDates);


推荐阅读