我有以下示例数据。

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。假设您有给定的indexTransIdindexNode,则如下所示:

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

07-24 20:39