将数组格式化为新数组

时间:2014-04-08 20:29:32

标签: javascript jquery json underscore.js

我有一个对象数组。我想重新格式化为一个新阵列,但我不知道如何开始。我有jQuery和Underscore可用。

这是我原来的数组:

var myArray = [
  {
    "name": "Product",
    "value": "Car"
  },
  {
    "name": "Product",
    "value": "Boat"
  },
  {
    "name": "Product",
    "value": "Truck"
  },
  {
    "name": "Color",
    "value": "Blue"
  },
  {
    "name": "Location",
    "value": "Store"
  }
];

以下是我试图让新数组看起来像:

var newArray = [
  {
    "name": "Product",
    "value": "Car Boat Truck"
  },
  {
    "name": "Color",
    "value": "Blue"
  },
  {
    "name": "Location",
    "value": "Store"
  }
];

在newArray中,产品都在一个对象中。

2 个答案:

答案 0 :(得分:2)

您可以使用groupBy方法将所有具有相同名称的元素放在一起,然后map将它们转换为您想要的内容。 pluck在此处用于组合输出数组中的值。

这是一个快速,简单的解决方案:

var newArray = _.chain(myArray)
                .groupBy("name")
                .map(function(a) { 
                    return { 
                        "name": a[0].name, 
                        "value":  _.pluck(a, "value").join(" ")
                    };
                })
                .value();

Demonstration

仅仅为了完整性,这里是非链式版本:

var newArray = _.map(_.groupBy(myArray, "name"), function(a) { 
                    return { 
                        "name": a[0].name, 
                        "value":  _.pluck(a, "value").join(" ")
                    };
                });

答案 1 :(得分:2)

这是一个更通用的解决方案,可以重复使用,而不是硬编码。这样,您可以为不同对象集合的不同属性创建多个groupBy方法,然后加入所需的属性。 jsFiddle

function groupBy(groupBy) {    
    return function(source, joinOn) {
        return _.each(_.groupBy(source, groupBy), function(val, key, context){
            context[key] = _.pluck(val, joinOn).join(' ');
        });
    };
}

var groupByNameOn = groupBy('name');
console.log(groupByNameOn(arr, 'value'));