如何通过密钥有效地重建和分组数组

时间:2017-10-03 06:16:02

标签: javascript arrays underscore.js

有没有人知道最有效 loadash或underscore.js通过对象键对对象数组进行分组然后根据分组创建新的对象数组?例如,我有一系列汽车对象:

    var cars = [

        {
            'make': 'audi',
            'model: 'r8',
            'year': '2012'
        },
        {
            'make': 'audi',
            'model: 'rs5',
            'year': '2013'
        },
        {
            'make': 'ford',
            'model: 'mustang',
            'year': '2012'
        },
        {
            'make': 'ford',
            'model: 'fusion',
            'year': '2015'
        },
        {
            'make': 'kia',
            'model: 'optima',
            'year': '2012'
        },

    ];

我想制作一个按keys分组的新汽车对象数组:

var cars = 
[{
        "title": "make",
        "data": [{
                "value": "audi"
            },
            {
                "value": "ford"
            },
            {
                "value": "kia"
            }
        ]
    },
    {
        "title": "model",
        "data": [{
                "value": "r8"
            },
            {
                "value": "rs5"
            },
            {
                "value": "mustang"
            },
            {
                "value": "fusion"
            },
            {
                "value": "optima"
            }
        ]
    },
    {
        "title": "year",
        "data": [{
                "value": "2012"
            },
            {
                "value": "2013"
            },
            {
                "value": "2015"
            }
        ]
    }
]

提前致谢!

3 个答案:

答案 0 :(得分:1)

你需要这样的东西。



 var cars =[
  {
    'make': 'audi',
    'model': 'r8',
    'year': '2012'
  },
  {
    'make': 'audi',
    'model': 'rs5',
    'year': '2013'
  },
  {
    'make': 'ford',
    'model': 'mustang',
    'year': '2012'
  }
];
var result = _.map(cars, car => _. pairs(car))

console.log(result);

<script src="https://cdnjs.cloudflare.com/ajax/libs/underscore.js/1.8.3/underscore-min.js"></script>
&#13;
&#13;
&#13;

然后,根据需要对数组进行分组。

答案 1 :(得分:1)

可能不是非常有效但可读且直接的方法(没有lodash或下划线):

var cars = [
    {
        'make': 'audi',
        'model': 'r8',
        'year': '2012'
    },
    {
        'make': 'audi',
        'model': 'rs5',
        'year': '2013'
    },
    {
        'make': 'ford',
        'model': 'mustang',
        'year': '2012'
    },
    {
        'make': 'ford',
        'model': 'fusion',
        'year': '2015'
    },
    {
        'make': 'kia',
        'model': 'optima',
        'year': '2012'
    },

];

var res = [];
cars.forEach(car => {
    var keys = Object.keys(car);
    keys.forEach(key => {
        var obj = res.find(o => o.title === key);
        if (obj) {
            if (!obj.data.some(it => it.value === car[key])) {			
                obj.data.push( { value: car[key]} );	
            }		
        } else {
            res.push( {title: key, data: []} );
        }
    });
});
console.log(res);

答案 2 :(得分:1)

不需要lodash或下划线。检查我的实现。

function GroupArray(array) {
  let result = {};
  array.forEach(function(item) {
    Object.keys(item).forEach(function(key) {
      if (!result[key]) result[key] = [];
      if (result[key].indexOf(item[key]) == -1) {
        result[key].push(item[key]);
      }
    });
  });
  return result;
}

var cars = [
        {
            'make': 'audi',
            'model': 'hello',
            'year': '2012'
        },
        {
            'make': 'audi',
            'model': 'rs5',
            'year': '2013'
        },
        {
            'make': 'ford',
            'model': 'mustang',
            'year': '2012'
        },
        {
            'make': 'ford',
            'model': 'fusion',
            'year': '2015'
        },
        {
            'make': 'kia',
            'model': 'optima',
            'year': '2012'
        },

    ];

console.log(GroupArray(cars));