【问题标题】:Javascript => Match array elements to each other by dateJavascript => 按日期相互匹配数组元素
【发布时间】: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() 会更合适,因为您正在减少。或任何循环并有条件地推入先前声明的空数组

标签: javascript arrays angular dictionary typescript


【解决方案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]);

【讨论】:

  • 最后我改变了我的方法并且没有连接数组。我遵循了您的方法并对其进行了一些调整以适应我的使用,并以更快的数据形成速度解决了问题。谢谢你的好建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
  • 2010-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2018-09-08
相关资源
最近更新 更多