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()