首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >lodash中是否有替换匹配项的函数

lodash中是否有替换匹配项的函数
EN

Stack Overflow用户
提问于 2014-12-25 04:06:31
回答 16查看 178.1K关注 0票数 160

我想知道在lodash中是否有更简单的方法来替换JavaScript集合中的项?(可能是duplicate,但我不明白那里的答案:)

我看了他们的文档,但什么也没找到

我的代码是:

代码语言:javascript
运行
复制
var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}];
// Can following code be reduced to something like _.XX(arr, {id:1}, {id:1, name: "New Name"});
_.each(arr, function(a, idx){
  if(a.id === 1){
    arr[idx] = {id:1, name: "Person New Name"};
    return false;
  }
});

_.each(arr, function(a){
  document.write(a.name);
});

更新:我尝试用来替换的对象有很多属性,比如

{id: 1,Prop1:...,Prop2:...等}

解决方案:

多亏了dfsq,但我在lodash中找到了一个合适的解决方案,它似乎工作得很好,而且相当整洁,我也把它放在了一个mixin中,因为我在很多地方都有这个需求。JSBin

代码语言:javascript
运行
复制
var update = function(arr, key, newval) {
  var match = _.find(arr, key);
  if(match)
    _.merge(match, newval);
  else
    arr.push(newval);    
};

_.mixin({ '$update': update });

var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}];

_.$update(arr, {id:1}, {id:1, name: "New Val"});


document.write(JSON.stringify(arr));

更快的解决方案正如@dfsq所指出的,下面是更快的方法

代码语言:javascript
运行
复制
var upsert = function (arr, key, newval) {
    var match = _.find(arr, key);
    if(match){
        var index = _.indexOf(arr, _.find(arr, key));
        arr.splice(index, 1, newval);
    } else {
        arr.push(newval);
    }
};
EN

回答 16

Stack Overflow用户

回答已采纳

发布于 2014-12-25 04:24:10

在本例中,您需要做的就是在数组中查找对象并使用Array.prototype.splice()方法,请阅读更多详细信息here

代码语言:javascript
运行
复制
var arr = [{id: 1, name: "Person 1"}, {id:2, name:"Person 2"}];

// Find item index using _.findIndex (thanks @AJ Richardson for comment)
var index = _.findIndex(arr, {id: 1});

// Replace item at index using native splice
arr.splice(index, 1, {id: 100, name: 'New object.'});

// "console.log" result
document.write(JSON.stringify( arr ));
代码语言:javascript
运行
复制
<script src="//cdnjs.cloudflare.com/ajax/libs/lodash.js/2.4.1/lodash.min.js"></script>

票数 216
EN

Stack Overflow用户

发布于 2017-01-23 13:30:30

似乎最简单的解决方案是使用ES6的.map或lodash的_.map

代码语言:javascript
运行
复制
var arr = [{id: 1, name: "Person 1"}, {id: 2, name: "Person 2"}];

// lodash
var newArr = _.map(arr, function(a) {
  return a.id === 1 ? {id: 1, name: "Person New Name"} : a;
});

// ES6
var newArr = arr.map(function(a) {
  return a.id === 1 ? {id: 1, name: "Person New Name"} : a;
});

这有一个很好的效果,避免了改变原始数组。

票数 56
EN

Stack Overflow用户

发布于 2018-05-29 16:12:01

ES6这段代码很适合我。

代码语言:javascript
运行
复制
let result = array.map(item => item.id === updatedItem.id ? updatedItem : item)
票数 33
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27641731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档