Javascript合并/减少相同的多维对象 [英] Javascript merge/reduce same multi dimensional objects

查看:107
本文介绍了Javascript合并/减少相同的多维对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

基于我的问题: https://stackoverflow.com/a/40661953/2392461 ,我打开一个新的问题与样本数据。

based on my question: https://stackoverflow.com/a/40661953/2392461, i open a new question with sample data.

我想合并/减少这个:

var array = [{
  'key1': {
    'key11': 0,
    'key12': 1
  },
  'key2': 0,
  'key3': {
    'key31': [1, 2],
    'key32': {
        'key321': 3,
        'key322': [1, 2]
    }
  },
  'key4': 'test'
  }, {
  'key1': {
    'key11': 1,
    'key12': 9
  },
  'key2': 2,
  'key3': {
    'key31': [4, 3],
    'key32': {
        'key321': 6,
        'key322': [8, 9]
    }
  },
  'key4': 'test'
  }, {
  'key1': {
    'key11': 3,
    'key12': 4
  },
  'key2': 7,
  'key3': {
    'key31': [3, 2],
    'key32': {
        'key321': 6,
        'key322': [7, 8]
    }
  },
  'key4': 'test'
}];

到此:

{
  'key1': {
    'key11': [0, 1, 3],
    'key12': [1, 9, 4]
  },
  'key2': [0, 2, 7],
  'key3': {
    'key31': [[1, 2], [4, 3], [3, 2]],
    'key32': {
        'key321': [3, 6, 6],
        'key322': [[1, 2], [8, 9], [7, 8]]
    }
  },
  'key4': 'test'
}

减少功能( https://stackoverflow.com/a/40668315/来自@stasovlas的2392461 )lodash看起来不错,但我需要深入了解对象。

the reduce function (https://stackoverflow.com/a/40668315/2392461) from @stasovlas with lodash looks good but i need to go deeper in the object.

_.reduce(data, function(result, item) {
    var added = _.find(result, {
        key4: item.key4
    });
    if (_.isObject(added)) {
        //!! better to merge with new object and add result to array again to avoid mutable
        added = _.mergeWith(added, item, function(addedVal, itemVal, key) {
            if (key === 'key4') {
                return addedVal;
            }
            return _.concat(addedVal, itemVal);
        });
        return result;
    }
    return _.concat(result, item);
}, []);

结果只是在对象的第1层中的合并对象。

result is here a merged object only in layer 1 of the object.

[ { key1: [ [Object], [Object], [Object] ],
    key2: [ 0, 2, 7 ],
    key3: [ [Object], [Object], [Object] ],
    key4: 1 } ]

我不知道如何得到我的结果。我想我必须迭代每个对象n次。 n是对象的深度。

i have no idea how to get my result. i think i have to iterate each object n times. n is the depth of the object.

这是正确的方式还是比我想的更容易?

is this the right way or is it easier than i think?

greetings mok

greetings mok

推荐答案

您可以通过迭代源对象的条目来合并每个级别,并创建新对象或数组用于添加结果。继续使用子对象。

You could merge each level by iterating the entries of the source object and create either a new object or an array for adding the result. Proceed with child objects.

key4 获得特殊待遇。

function merge(target, source) {
    var singleKey = 'key4';
    Object.entries(source).forEach(([key, value]) => {
        if (value && typeof value === 'object' && !Array.isArray(value)) {
            merge(target[key] = target[key] || {}, value);
            return;
        }
        if (key === singleKey) {
            target[key] = value;
            return;
        }
        target[key] = target[key] || [];
        target[key].push(value);
    });
    return target;
}

var array = [{ key1: { key11: 0, key12: 1 }, key2: 0, key3: { key31: [1, 2], key32: { key321: 3, key322: [1, 2] } }, key4: "test" }, { key1: { key11: 1, key12: 9 }, key2: 2, key3: { key31: [4, 3], key32: { key321: 6, key322: [8, 9] } }, key4: "test" }, { key1: { key11: 3, key12: 4 }, key2: 7, key3: { key31: [3, 2], key32: { key321: 6, key322: [7, 8] } }, key4: "test" }],
    result = array.reduce(merge, {});

console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }

这篇关于Javascript合并/减少相同的多维对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆