Вы можете использовать mergeWith()
следующим образом:
const output = _.mergeWith({}, ...input, (t, s) => {
if (!_.isObject(s)) return t ? [...t, s] : [s]
});
const input = [{
food: {
fruits: {
apples: 2,
bananas: 3,
peaches: 'square',
citrus: [100, 200, 300]
},
meat: {
beef: 1000,
chicken: 2000
}
}
}, {
food: {
fruits: {
apples: 4,
bananas: 5,
peaches: 'triangle',
citrus: [101, 201, 301]
},
meat: {
beef: 1001,
chicken: 2001
}
}
}];
const output = _.mergeWith({}, ...input, (t, s) => {
if (!_.isObject(s)) return t ? [...t, s] : [s]
});
console.log(output);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
Возвращает именно тот результат, который вам нужен (после исправления несоответствий ввода):
{
"food": {
"fruits": {
"apples": [2, 4],
"bananas": [3, 5],
"peaches": ["square", "triangle"],
"citrus": [[100, 101], [200, 201], [300, 301]]
},
"meat": {
"beef": [1000, 1001],
"chicken": [2000, 2001]
}
}
}