我有以下数组
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。
答案 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 a
和const 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>