我有以下示例数据。
var data = [{
"_id" : ObjectId("583f6e6d14c8042dd7c979e6"),
"transid" : 1,
"acct" : "acct1",
"transdate" : ISODate("2012-01-31T05:00:00.000Z"),
"category" : "category1",
"amount" : 103
}, {
"_id" : ObjectId("583f6e6d14c8042dd7c2132t6"),
"transid" : 2,
"acct" : "acct2",
"transdate" : ISODate("2012-01-31T05:00:00.000Z"),
"category" : "category2",
"amount" : 103
}, {
"_id" : ObjectId("583f6e6d14c8042dd7c2132t6"),
"transid" : 3,
"acct" : "acct2",
"transdate" : ISODate("2016-07-31T05:00:00.000Z"),
"category" : "category1",
"amount" : 103
}]
我想根据索引找到一个特定的元素,然后编辑一个键,然后将其附加到现有变量中。最好的方法是什么,我使用过.map和.filter选项,但是然后我不能只返回使用.map时匹配的已编辑元素。
我尝试过的一些事情:
//save the changes on the passed in item
let transUpdate = trans.map(item => {
if (item.transid === indexTransId) {
return Object.assign({}, item, { notes: indexNote })
}
return item //if non matched item then just return the default
})
这是一种工作方式,但它返回的变量(transUpdate)具有所有
trans数组中的元素。我只想要indexTransId的匹配条件,并将其附加到transUpdate。如果默认情况下,我在非过分匹配中不返回任何内容,则会收到错误消息。如果默认情况下我返回null,那么我得到一个空对象,但是我只想只包含匹配的transid。
我确定有几种方法可以执行此操作,并且可以使用循环和ifs,但是我对使用ES6语法完成此操作的一些更优雅的方法感兴趣。
最佳答案
要附加到transUpdate
,您确实需要使用filter
。假设您有给定的indexTransId
和indexNode
,则如下所示:
transUpdate.push(...trans.filter(item => item.transid === indexTransId)
.map(item => Object.assign({}, item, { notes: indexNote })));
请注意,如果您执行
Object.assign(item, { notes: indexNote })
,则将对原始的item
进行突变:这将是一个副作用,与功能编程不符。仅添加新的
transid
值:在注释中添加了一个规范:
transUpdate
不应两次获得相同的transid
,但在这种情况下,请更新该记录。为此目的,数组不太合适。您可以改用
Map
。您将声明如下:transUpdate = new Map;
然后,您可以像这样更新它:
trans.filter(item => item.transid === indexTransId)
.map(item => transUpdate.set(indexTransId,
Object.assign({}, item, { notes: indexNote })));
要以数组格式从
transUpdate
获取值,请执行以下操作:[...transUpdate.values()]