按索引查找对象并将其替换为其他对象。 (阵营/终极版)

时间:2016-11-08 18:13:54

标签: javascript reactjs lodash

我有以下数组

var a = [{'error': 0 , 'link': 'www.abc.com'},{'error': 1 , 'link': 'www.xyz.com'},{'error': 2 , 'link': 'www.bbc.com'}]

现在我想使用lodash

替换索引1处的下面的对象
var b = {'error': 1 , 'link': 'www.change.com'}

因此输出应低于数组

a = [{'error': 0 , 'link': 'www.abc.com'},{'error': 1 , 'link': 'www.change.com'},{'error': 2 , 'link': 'www.bbc.com'}]

但我不想用[1] = b来做。 它在减速器状态下产生问题。 我想切片a并在第一个索引中添加b。

1 个答案:

答案 0 :(得分:1)

如果你绝对需要保留那个数组结构并使用lodash,那么这就可以了:

const a = [{error: 0 , link: 'www.abc.com'}, {error: 1 , link: 'www.xyz.com'}, {error: 2 , link: 'www.bbc.com'}];
const b = {error: 1 , link: 'www.change.com'};
const c = _.map(a, item => item.error === b.error ? _.merge(item, b) : item);

由于Redux使用不变性,你真的不想改变a。您需要使用所需的转换创建一个新数组,在本例中为const c

在上面的代码段中,c = [{error: 0 , link: 'www.abc.com'}, {error: 1 , link: 'www.change.com'}, {error: 2 , link: 'www.bbc.com'}],这就是您所追求的目标。

_.map返回一个新数组,而不是改变现有数组,因此const aconst b将保持不变,而const c将合并为2。

编写可扩展到其他方案的代码可能是个好主意。上面的示例依赖于const b,这可能会限制您的代码。

我建议创建一个匿名replaceErrorLink函数,您可以将其用于其他情况,如下所示(注意:这使用ES6语法):

const a = [{error: 0 , link: 'www.abc.com'}, {error: 1 , link: 'www.xyz.com'}, {error: 2 , link: 'www.bbc.com'}];


const replaceErrorLink = collection => (error, link) => _.map(collection, item => item.error === error ? {...item, link} : item);

const b = replaceErrorLink(a)(1, 'www.change.com');
const c = replaceErrorLink(a)(2, 'www.changezz.com');
const d = replaceErrorLink(b)(2, 'www.changezz.com');

console.log('a: ', a); // note that a didn't mutate
console.log('b: ', b);
console.log('c: ', c);
console.log('d: ', d);
<script src="https://cdn.jsdelivr.net/lodash/4.16.6/lodash.min.js"></script>