在lodash上有一个替代_.merge.apply(_,x);其中x是一个对象数组?

时间:2016-05-09 20:18:51

标签: javascript arrays lodash

我想使用lodash将对象数组中的所有属性合并为一个对象?我可以迭代数组或在_.merge上调用apply:

const arr = [{1:1, 2:2},{3:3},{4:4}];

_.merge.apply(_, arr); //{1:1, 2:2, 3:3, 4:4};

有没有使用申请的替代方案?

5 个答案:

答案 0 :(得分:1)

Working Example

你可以使用每个并扩展:

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等)效率低于他们需要的效率,因为_.mergeObject.assign支持两个以上的参数。

答案 4 :(得分:0)

您可以使用reduce() merge()作为迭代器,使用空对象作为合并的基础对象,以防止突变任何数组项的突变。

&#13;
&#13;
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;
&#13;
&#13;

注意:您现在正在使用的解决方案会改变数组的项目。