Arrays 筛选器没有迭代数组中的所有元素。为什么?

Arrays 筛选器没有迭代数组中的所有元素。为什么?,arrays,ecmascript-6,filter,Arrays,Ecmascript 6,Filter,我想通过一个返回的星期数组进行筛选,并将同一天的同一类型事件和另一个按同一天但不同类型事件分组的新数组viceversa组合在一起 // I have created a static array with all the events const types = ["Event", "Food", "Other", "Real Estate"]; // this is what the filtered days array returns 到目前为止,这是我能够做到的: const fi

我想通过一个返回的星期数组进行筛选,并将同一天的同一类型事件和另一个按同一天但不同类型事件分组的新数组viceversa组合在一起

// I have created a static array with all the events
const types = ["Event", "Food", "Other", "Real Estate"];

// this is what the filtered days array returns
到目前为止,这是我能够做到的:

const filteredEqualTypes = types.map((type, i) =>
   filteredDays[i].filter(filteredDay => filteredDay.type === type)
);
…但它会在星期四之前停止,返回一个空数组,即使它应该返回一个包含2个对象的数组,因为星期四有2个相等的事件


这是因为您正在地图中使用filteredDays[i],即通过索引访问filteredDays数组。这意味着这项活动只适用于周一,而食物只适用于周二,以此类推。您希望在整个fitleredDays数组中执行筛选,而不是在特定的条目/项中执行筛选,即filteredDays[i]

由于您只有4种类型,这意味着除此之外,您将只执行筛选,直到周三,这就是为什么您没有看到更多的条目

因此,根据您的要求,如果希望根据类型对事件进行分组,则可以执行以下操作:

检查所有你已经正确完成的类型 对于每种类型,您都需要遍历整个filteredDays数组 在每次迭代中,您都会像往常一样进行过滤 返回集合后,您希望将其展平,因为您将返回按天分组的原始结构事件。您需要一个扁平的事件数组,而不是按天分组。这可以通过使用。 更新代码:

const filteredEqualTypes = types.map((type) => {
  // Returns a nested array
  const entriesMatchingType = filteredDays.map((filteredDay) => {
    return filteredDay.filter((day) => day.type === type);
  });

  // Use Array.prototype.flat to flatten the nested arrays
  return entriesMatchingType.flat();
});
见下面的概念证明:

常量类型=[活动、食品、其他、房地产]; 常量过滤器日期=[ [{ 一周中的第二天:“星期一”, 键入:“事件”, }, { 一周中的第二天:“星期一”, 键入:“事件”, }], [{ 一周中的第二天:“星期二”, 类型:“食物”, }, { 一周中的第二天:“星期二”, 键入:“其他”, }, { 一周中的第二天:“星期二”, 类型:“食物”, }], [{ 一周中的第二天:“星期三”, 类型:'不动产', }, { 一周中的第二天:“星期三”, 键入:“其他”, }], [{ 一周中的第二天:“星期四”, 键入:“其他”, }, { 一周中的第二天:“星期四”, 键入:“其他”, }], [{ 一周中的第二天:“星期五”, 类型:'不动产', }], ]; const filteredEqualTypes=types.maptype=>{ 常量entriesMatchingType=filteredDays.mapfilteredDay=>{ 返回filteredDay.filterdday=>day.type==type; }; 返回中心MatchingType.flat; };
console.logfilteredqualtypes 您不需要迭代类型,而是需要迭代filteredDays,以映射所有天数,而不仅仅是与有效类型长度相等的天数

const res = filteredDays.map(day => day.filter(val => types.includes(val.type)));

你能分享你最初的filteredDays数组的JSON吗?好的,非常感谢你的解释,还有一件小事,我想把它按事件分组,也可以按同一天分组,如果周二只有一个类似于其他的事件,我不希望它与周三[其他]和周四[其他]一起,而是作为单个元素。这是可能的吗?如果你仍然想在白天把它们筑巢,那么就不需要使用.flat.mazing,再次感谢,我已经将你的答案标记为正确答案