【发布时间】: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