Javascript => 按日期相互匹配数组元素

Posted

技术标签:

【中文标题】Javascript => 按日期相互匹配数组元素【英文标题】:Javascript => Match array elements to each other by date 【发布时间】:2017-10-06 04:26:23 【问题描述】:

我有一个包含 50 多个对象的数组。该数组是 concat(ing) 两个数组的结果。此数组中的元素是对象,每个对象都有键“日期”,日期字符串格式为:

`"2017-03-31T11:30:00.000Z"`

并用文字键入“标题”。所以我有这样的元素:

[
    date: "2017-03-31T11:30:00.000Z", caption: "text_1",
    date: "2016-03-31T11:30:00.000Z", caption: "text_2",
    date: "2016-03-31T11:30:00.000Z", caption: "text_3",
    date: "2017-03-31T11:30:00.000Z", caption: "text_4"
]

在 Ruby 中,我知道得更好更深入,您可以映射数组中的元素并返回新元素并通过 if 语句返回条件。我想知道 JS 中是否有类似的东西,我目前正在遍历数组并将每个元素与其他元素匹配,但这不是最高效的方式。我想做类似的事情:

let newArray = myArray.map( (a,b) => if (a.date === b.date) return text1: a.caption, text2: b.caption);

所以结果是:

[
  text1: "text_1", text2: "text_4",
  text1: "text_2", text2: "text_3"
]

是否存在这样的东西,既优雅又高效?

谢谢...

【问题讨论】:

所以点击<> sn-p 编辑器并创建一个minimal reproducible example 这样我们可以更好地帮助 var 结果 = array.filter(i=> i.date == date); 对于map() 来说不是真的,因为你只是有条件地返回。结果数组的长度仍与原始数组相同,但充满了孔 您的问题不清楚。 JS中有不同的方法适合不同的用例。但请记住,当您说最高效时,没有任何与数组相关的函数可以击败for。所以我建议你先用for 写它。此外,您的代码将无法工作,因为 .map 签名是 (item, index, array) Array#reduce() 会更合适,因为您正在减少。或任何循环并有条件地推入先前声明的空数组 【参考方案1】:

您的问题的答案是: 不,javascript 中没有任何功能可以按照您的意愿优雅地完成您想要的事情(不确定性能)。

对于您的特定用例,我只需创建一个使用日期作为键并收集不同标题的新对象,然后将该对象转换为数组:

const collected = ;

myArray.forEach((entry) => 
    if (entry.date in collected) 
        collected[entry.date].text2 = entry.caption;
     else 
        collected[entry.date] =  text1: entry.caption ;
    
);

const newArray = Object.keys(collected).map(key => collected[key]);

【讨论】:

最后我改变了我的方法并且没有连接数组。我遵循了您的方法并对其进行了一些调整以适应我的使用,并以更快的数据形成速度解决了问题。谢谢你的好建议。

以上是关于Javascript => 按日期相互匹配数组元素的主要内容,如果未能解决你的问题,请参考以下文章

javascript时间戳和日期字符串相互转换

javascript时间戳与日期格式的相互转换

按日期获取匹配结果

简单按日期查询mysql某张表中的记录数

git代码统计工具gitstat安装

javascript javascript正则表达式匹配日期模式YYYY-MM-DD