Javascript Lodash:使用最新项目创建新阵列
我有一个数组如下Javascript Lodash:使用最新项目创建新阵列,javascript,arrays,lodash,Javascript,Arrays,Lodash,我有一个数组如下 [{ "id": "001", "name": "A", "timestamp_created": "2019-02-27T11:22:19" }, { "id": "002", "name": "A", "timestamp_created": "2019-02-27T11:30:19" }, { "id": "003",
[{
"id": "001",
"name": "A",
"timestamp_created": "2019-02-27T11:22:19"
},
{
"id": "002",
"name": "A",
"timestamp_created": "2019-02-27T11:30:19"
},
{
"id": "003",
"name": "B",
"timestamp_created": "2019-02-27T10:15:19"
},
{
"id": "004",
"name": "B",
"timestamp_created": "2019-02-27T11:05:19"
}
]
我想基于上述数组创建一个新数组,但只包含最新的项(按项的名称分组)
如何结合不同的Lodash的特性来达到效果
任何建议,请帮助我 您可以获取、收集所有最新项目(通过检查创建的时间戳
),按名称
分组并获取值
var data=[{id:“002”,name:“A”,创建的时间戳:“2019-02-27T11:30:19”},{id:“003”,name:“B”,创建的时间戳:“2019-02-27T10:15:19”},{id:“004”,name:“B”,创建的时间戳:“2019-02-27T11:05:19”},{id:“001”,name:“A”,创建的时间戳:“2019-02-27T11:22:19”},
结果=数组。从(数据)
.减少(
(m,o)=>m.has(o.name)和&m.get(o.name)。创建的时间戳>创建的时间戳
M
:m.set(o.name,o),
新地图
)
.values()
);
控制台日志(结果)代码>
。作为控制台包装{max height:100%!important;top:0;}
而不使用库lodash
,您可以使用生成结果:
const输入=[
{
“id”:“001”,
“姓名”:“A”,
“创建的时间戳”:“2019-02-27T11:22:19”
},
{
“id”:“002”,
“姓名”:“A”,
“创建的时间戳”:“2019-02-27T11:30:19”
},
{
“id”:“003”,
“名称”:“B”,
“创建的时间戳”:“2019-02-27T10:15:19”
},
{
“id”:“004”,
“名称”:“B”,
“创建的时间戳”:“2019-02-27T11:05:19”
}
];
让res=input.reduce((acc,{id,name,timestamp_created})=>
{
acc[name]=acc[name]|{id,name,timestamp_created};
if(acc[name]。创建的时间戳<创建的时间戳)
acc[name]={id,name,timestamp_created};
返回acc;
}, {});
console.log(Object.values(res))代码>
.as控制台{背景色:黑色!重要;颜色:石灰;}
.as console wrapper{max height:100%!important;top:0;}
如果要使用lodash,这将完成此工作
function latestItems(original) {
filtered = [];
grouped = _.groupBy(original, "name");
_.forEach(grouped, function (group) {
newest = {
"timestamp_created": "0"
};
_.forEach(group, function (item) {
if (item.timestamp_created > newest.timestamp_created) {
newest = item;
}
});
filtered.push(newest);
});
return filtered;
}
到目前为止,答案很好。OP要求提供Lodash解决方案,如下所示:
const数据=[{
“id”:“001”,
“姓名”:“A”,
“创建的时间戳”:“2019-02-27T11:22:19”
},
{
“id”:“002”,
“姓名”:“A”,
“创建的时间戳”:“2019-02-27T11:30:19”
},
{
“id”:“003”,
“名称”:“B”,
“创建的时间戳”:“2019-02-27T10:15:19”
},
{
“id”:“004”,
“名称”:“B”,
“创建的时间戳”:“2019-02-27T11:05:19”
}
];
常量还原函数=(acc,val)=>{
如果(acc中的val.name){
如果(val.timestamp_created>acc[val.name].timestamp_created){
acc[val.name]=val
}
}否则{
acc[val.name]=val
}
返回acc;
};
常量filteredData=\ u0.values(
_.reduce(数据,reduceFunction,{})
);
使用lodash的简短解决方案
const data = [...]
const result = _(data)
.groupBy('name')
.map(group => _.maxBy(group, 'timestamp_created'))
.value()
使用groupBy
按名称分组。然后使用maxBy
获取创建了最大时间戳的对象
\.maxBy(数组,[iteratee=\.identity])
该方法与uz.max类似,只是它接受iteratee,该iteratee对数组中的每个元素调用,以生成值的排序标准。使用一个参数(value)调用iteratee
最近两项?每个名称的最新项是什么?例如,数组有2个项(A,B),但创建的时间戳不同,我想创建一个新数组,使用最新A和最新B,这取决于时间戳节省字符的工作量:我称之为Nina因子;)为了回答那些需要一些代码和脚本的问题,必须对编写的代码如何工作进行描述。
const data = [...]
const result = _(data)
.groupBy('name')
.map(group => _.maxBy(group, 'timestamp_created'))
.value()