lodash方法合并2个不同大小的对象

时间:2017-03-17 14:30:17

标签: javascript lodash

是否有任何方法可以合并2个这样的对象数组

var a = [{id: 1, val: 1},{id: 2, val: 2},{id: 3, val: 3},{id: 4, val: 4},{id: 5, val: 5}];
var b = [{id: 21, val: 21},{id: 22, val: 22},{id: 23, val: 23}]

//final result should be
c = [
  {id:1, val: 1},
  {id:21, val: 21},
  {id:2, val: 2},
  {id:22, val: 22},
  {id:3, val: 3},
  {id:23, val: 23},
  {id:4, val: 4},
  {id:5, val: 5}
]

offcourse我可以自己创建它,但只是想检查lodash是否提供它

4 个答案:

答案 0 :(得分:2)

您可以先zip数组,flatten结果,然后使用compact删除缺少的数组元素(zip将它们添加为未定义):

var c = _.compact(_.flatten(_.zip(a,b)))

或使用链接:

var c = _(a)
    .zip(b)
    .flatten()
    .compact()
    .value()

var a = [{id: 1, val: 1},{id: 2, val: 2},{id: 3, val: 3},{id: 4, val: 4},{id: 5, val: 5}];
var b = [{id: 21, val: 21},{id: 22, val: 22},{id: 23, val: 23}]

var c = _(a)
    .zip(b)
    .flatten()
    .compact()
    .value()
    
document.getElementById('results').textContent = JSON.stringify(c);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

<pre id="results"></pre>

答案 1 :(得分:1)

使用Math.max()(查找更大的数组大小)和Array.prototype.push()函数

Ecmascript5 解决方案:

&#13;
&#13;
var a = [{id: 1, val: 1},{id: 2, val: 2},{id: 3, val: 3},{id: 4, val: 4},{id: 5, val: 5}],
    b = [{id: 21, val: 21},{id: 22, val: 22},{id: 23, val: 23}],
    maxLen = Math.max(a.length, b.length), aLen = a.length, bLen = b.length,
    maxList = aLen > bLen ? a : b;
    result = [];

for (var i = 0; i < maxLen; i++) {
    (i < aLen && i < bLen) ? result.push(a[i], b[i]) : result.push(maxList[i]);
}

console.log(result);
&#13;
&#13;
&#13;

答案 2 :(得分:1)

在普通的Javascript中,你可以使用一个迭代到两者最小长度的函数,汇总值并在结尾处连接其余部分。

function insert(a, b) {
    var c = [],
        i = 0,
        l = Math.min(a.length, b.length);
    while (i < l) {
        c.push(a[i], b[i]);
        i++;
    }
    return c.concat(a.slice(i), b.slice(i));
}

var a = [{ id: 1, val: 1 }, { id: 2, val: 2 }, { id: 3, val: 3 }, { id: 4, val: 4 }, { id: 5, val: 5 }],
    b = [{ id: 21, val: 21 }, { id: 22, val: 22 }, { id: 23, val: 23 }];

console.log(insert(a, b));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 3 :(得分:1)

&#13;
&#13;
var a = [{id: 1, val: 1},{id: 2, val: 2},{id: 3, val: 3},{id: 4, val: 4},{id: 5, val: 5}];
var b = [{id: 21, val: 21},{id: 22, val: 22},{id: 23, val: 23}];

// loop through the biggest array and reduce the result (no need for the value we just need the accumulator and the index)
var result = _.reduce(a.length < b.length? b: a, function(res, _, i) {
  if(i < a.length) res.push(a[i]); // if there is still elements in a, push the current one
  if(i < b.length) res.push(b[i]); // if there is still elements in b, push the current one
  return res;
}, []);

console.log(result);
&#13;
<script src="https://cdn.jsdelivr.net/lodash/4.17.4/lodash.min.js"></script>
&#13;
&#13;
&#13;