在javascript中查找对象(在另一个对象内)中的最长数组

时间:2017-12-06 07:29:41

标签: javascript arrays object

我有一个物体对象。在这些对象中是具有更多对象的数组。 以下是结构。

我想找出父对象中最长的对象数组。 所以在下面的例子中:

  

对于ObjectOne - 最长的数组是B。

     

对于ObjectTwo,最长的数组是C.

mainobj = {
    ObjectOne: { 
        A: [ 
             { x: 'd', y: 'e'},
             { x: 'd', y: 2} 
           ],
        B: [ 
             { x: 'd', y: 'e'},
             { x: 'd', y: 'e'},
             { x: 'd', y: 'e'},
             { x: 'd', y: 'e'} 
           ],
        C: [ 
             { x: 'd', y: 'e'} 
           ]
    },
    ObjectTwo:{ 
        A: [
             { x: 'd', y: 'e'},
             { x: 'd', y: 'e'},
             { x: 'd', y: 'e'}
           ],
        B: [
             { x: 'd', y: 'e'},
             { x: 'd', y: 'e'}
           ],
        C: [
             { x: 'd', y: 'e'},
             { x: 'd', y: 'e'},
             { x: 'd', y: 'e'},
             { x: 'd', y: 'e'},
             { x: 'd', y: 'e'}
           ]
    }
}

我可以这样做:

var size = Object.values(mainobj).length

但我不知道如何更深入。例如,这不起作用:

var size = Object.values(mainobj)[0].length

This question is pretty similar,但我无法弄清楚如何应用它。 我很感激帮助!

2 个答案:

答案 0 :(得分:2)

您可以为每个外键返回一个对象,并获得一个内部数组键最大的数组。



var object = { objectOne: { A: [{ x: 'd', y: 'e' }, { x: 'd', y: 2 }], B: [{ x: 'd', y: 'e' }, { x: 'd', y: 'e' }, { x: 'd', y: 'e' }, { x: 'd', y: 'e' }], C: [{ x: 'd', y: 'e' }] }, objectTwo: { A: [{ x: 'd', y: 'e' }, { x: 'd', y: 'e' }, { x: 'd', y: 'e' }], B: [{ x: 'd', y: 'e' }, { x: 'd', y: 'e' }], C: [{ x: 'd', y: 'e' }, { x: 'd', y: 'e' }, { x: 'd', y: 'e' }, { x: 'd', y: 'e' }, { x: 'd', y: 'e' }] } },
    result = Object.keys(object).map(function (k) {
        var o = object[k];
        return {
            key: k,
            items: Object.keys(o).reduce(function (r, l, i) {
                if (!i || o[r[0]].length < o[l].length) {
                    return [l];
                }
                if (o[r[0]].length === o[l].length) {
                    r.push(l);
                }
                return r;
            }, [])
        };
    });

console.log(result);
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 1 :(得分:0)

您可以将objet转换为仅保留具有最大长度的数组:

var    mainObj =   {
                    1:{ 
                            A: [
                                        { x: 'd', y: 'e'},
                                        { x: 'd', y: 2}
                                    ],
                            B: [
                                        { x: 'd', y: 'e'},
                                        { x: 'd', y: 'e'},
                                        { x: 'd', y: 'e'},
                                        { x: 'd', y: 'e'}
                                    ],
                            C: [
                                        { x: 'd', y: 'e'}
                                    ]
                        },
                    2:{ 
                            A: [
                                        { x: 'd', y: 'e'},
                                        { x: 'd', y: 'e'},
                                        { x: 'd', y: 'e'}
                                    ],
                            B: [
                                        { x: 'd', y: 'e'},
                                        { x: 'd', y: 'e'}
                                    ],
                            C: [
                                        { x: 'd', y: 'e'},
                                        { x: 'd', y: 'e'},
                                        { x: 'd', y: 'e'},
                                        { x: 'd', y: 'e'},
                                        { x: 'd', y: 'e'}
                                    ]
                        }
                };

var res = {};

Object.keys(mainObj).forEach(key => {
    var maxLength = 0, nameOfmaxLenghtArray, maxLenghtArray;
    Object.keys(mainObj[key]).forEach(arrayName => {
        if (mainObj[key][arrayName].length > maxLength) {
            maxLengthArrayName = arrayName;
            maxLenghtArray = mainObj[key][arrayName];
            maxLength = mainObj[key][arrayName].length;
        }
    });
    res[key] = { [maxLengthArrayName ]: maxLenghtArray};
});

console.log('res: ', res);

// You can then access the max length array for each sub-object of mainobj:

var subObject = '1';
var maxLengthArrayName = Object.keys(res[subObject])[0];
var maxLengthArray = Object.values(res[subObject])[0];

console.log(`max length array name for sub-object ${subObject}: `, maxLengthArrayName);
console.log(`max length array for sub-object ${subObject}: `, maxLengthArray );