javascript - 使用javascript es6从包含唯一id和嵌套数组的多个对象数组中获取通用数据

标签 javascript arrays ecmascript-6

我试图从包含唯一 id(mongoose 对象 id)和字符串数组的多个对象数组中查找公共(public)数据。

例如:

array1 = [{
             _id: "60f027f98b55eb2df1f36c04",
             date: "2021-07-15T12:18:12.223Z",
             time: "30",
             hours: ["8:00 AM", "8:30 AM"]
        }]
array2 = [{
             _id: "60f027f98b55eb2df1f36c05",
             date: "2021-07-15T12:18:12.223Z",
             time: "60",
             hours: ["7:30 AM", "8:30 AM", "9:30AM"]
        }]
array3 = [{
             _id: "60f027f98b55eb2df1f36c06",
             date: "2021-07-16T12:12:12.223Z",
             time: "30",
             hours: ["7:00 AM", "8:30 AM"]
        }]

输出应在数组中具有最大公共(public)日期的最大公共(public)值,并且该日期应具有最大公共(public)小时。

因此示例输出应如下所示。

common_data = {
    date: "2021-07-15T12:18:12.223Z",
    time: "30",
    hours: "8:30AM"
}

我查看了其他答案并尝试了这样的操作: 合并所有数组并

let result = merged_slots_array.shift().filter(function(v) {
    return merged_slots_array.every(function(a) {
        const matchDate = a.date === v.date;
        const getMatchTime = a.hours.shift().filter(function(x) {
            return v.hours.every(function(t) {
                return x.indexOf(t) !== -1;
            })
        });
        return matchDate && getMatchTime
    });
});

但出现错误merged_slots_array.shift(...).filter不是函数

最佳答案

连接数组后,可以通过仅保留重复项的过滤器找到最大公共(public)时间,然后进行排序。一旦我们有了这个,我们就可以查询每个数组以确保它包含最大小时,然后提取最大日期和时间。我的输出与你的略有不同,因为我过滤了最长时间、小时和日期

array1 = [{
  _id: "60f027f98b55eb2df1f36c04",
  date: "2021-07-15T12:18:12.223Z",
  time: "30",
  hours: ["8:00 AM", "8:30 AM"]
}]
array2 = [{
  _id: "60f027f98b55eb2df1f36c05",
  date: "2021-07-15T12:18:12.223Z",
  time: "60",
  hours: ["7:30 AM", "8:30 AM", "9:30AM"]
}]
array3 = [{
  _id: "60f027f98b55eb2df1f36c06",
  date: "2021-07-16T12:12:12.223Z",
  time: "30",
  hours: ["7:00 AM", "8:30 AM"]
}]

const getCommon = (arrays) => {
let group = [].concat.apply([], [...arrays])
let hour = group.map(e=>e.hours).flat().filter((e,i,a) => a.indexOf(e) !== i).sort((a,b) => a.localeCompare(b))[0]
let common = group.filter(e=>e.hours.includes(hour))
let time = Math.max(...common.map(e => +e.time))
let date = common.map(e => e.date).sort((a,b) => new Date(b) - new Date(a))[0];
return {date: date, time: time, hours: [hour]}
}
let arg = []
arg.push(array1)
arg.push(array2)
arg.push(array3)
console.log(getCommon(arg))

TS Playground

关于javascript - 使用javascript es6从包含唯一id和嵌套数组的多个对象数组中获取通用数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68395318/

相关文章:

javascript - 成功回调后无法将字符串推送到数组

python - 将图像数据集存储到 4D 数组中然后显示每个图像会导致颜色失真

java - 捕获多个复选框选择 JSP 参数

c - 重新排列字符串字母

javascript - 如何在将元素插入数组时使用三元运算符

javascript - Try/Catch 不会捕获声明的常量错误

javascript - 如何在文本框/文本区域/文本输入中显示自动完成

javascript - 如何通过 javascript/AJAX 使用 reqres.in 中的数据

javascript - 命名导出函数声明后是否需要分号

javascript - 删除图像并在已删除部分中显示该删除的图像