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 => 按日期相互匹配数组元素的主要内容,如果未能解决你的问题,请参考以下文章