我想使用lodash将对象数组中的所有属性合并为一个对象?我可以迭代数组或在_.merge上调用apply:
const arr = [{1:1, 2:2},{3:3},{4:4}];
_.merge.apply(_, arr); //{1:1, 2:2, 3:3, 4:4};
有没有使用申请的替代方案?
答案 0 :(得分:1)
你可以使用每个并扩展:
var o = {};
var arr = [{1:1, 2:2},{3:3},{4:4}];
_.each(arr, function(e) {
_.extend(o, e);
});
或减少:
var otherWay = _.reduce(arr, function(obj, next) {
return _.extend(obj, next);
}, {});
答案 1 :(得分:0)
看起来像使用@properties = Listing.where(
baths__c: @baths,
bedrooms__c: @beds,
sales_price__c: (@pricemin..@pricemax),
status__c: 'Active',
website_approved__c: 'true'
).where(
'lower(city__c) LIKE :city AND zip_code__c LIKE :zip',
city: "%#{@city.downcase}%",
zip: "%#{@zip}%"
).page(params[:page]).per(4)
(JS不是lodash)的完美情况:
[].reduce

答案 2 :(得分:0)
我会给出一个非常愚蠢的答案。考虑一下,因为Object.assign()
只是制作浅层副本,如果你不喜欢递归操作,这可能会更好。
var arr = [{1:1, 2:2},{3:3},{4:4}],
merged = JSON.parse(arr.reduce((s,o)=> s+JSON.stringify(o),"").replace(/}{/g,","));
document.write("<pre>" +JSON.stringify(merged,null,2) + "</pre>");
答案 3 :(得分:0)
使用ES6,您可以这样做:
const arr = [{1:1, 2:2},{3:3},{4:4}];
_.merge(...arr);
如果您只定位支持此功能的新浏览器,或者您正在使用像Babel这样的转发器,那么您应该这样做。
如果您不想使用ES6,则没有理由不使用.apply
。它是Javascript的一部分。 Lodash无需重新发明此功能。 You shouldn't expect a library to do everything and replace the language itself.其他基于循环的答案(.reduce
,.each
等)效率低于他们需要的效率,因为_.merge
和Object.assign
支持两个以上的参数。
答案 4 :(得分:0)
您可以使用reduce() merge()作为迭代器,使用空对象作为合并的基础对象,以防止突变任何数组项的突变。
var arr = [{1:1, 2:2},{3:3},{4:4}];
var result = _.reduce(arr, _.merge, {});
document.write('<pre>' + JSON.stringify(result, 0, 4) + '</pre>');
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.11.2/lodash.js"></script>
&#13;
注意:您现在正在使用的解决方案会改变数组的项目。