如何创建一个带变量的对象作为名称?

时间:2014-12-20 22:26:30

标签: javascript arrays

这是我想要的,来自这个数组:

array1 = [{name: "a", value: 1, size: 2},{name: "a", value: 2, size: 3},{name: "b", value: 1 ,size: 4}];

创建一个这样的数组:

array2 = [{ "a", {value: 1, size: 2},{value: 2, size: 3}},{ "b",{value: 1 ,size: 4}}]

基本上创建一个包含基于其名称的“分组”对象的对象的数组。 我尝试使用foreach循环和类似函数来执行此操作:

var array1 = [{name: "a", value: 1, size: 2},{name: "a", value: 2, size: 3},{name: "b", value: 1 ,size: 4}];
var array2;
function make(element){
    array2['element[0]'] = [element[1], element[2]];
};
array1.forEach(make(this));

但是我收到一个错误:“TypeError:无法设置未定义的属性'element [0]'”。 我尝试使用Object.defineProperty方法但无法实现它。 我如何从array1到array2 ??

**我搜索了关于这个主题的类似问题,但找不到我问题的具体答案。

2 个答案:

答案 0 :(得分:0)

这是一个相当简单的解决方案:

var array1 = [{name: "a", value: 1, size: 2}, {name: "a", value: 2, size: 3}, {name: "b", value: 1 ,size: 4}];

function collect(arr) {
  var values = {};
  arr.forEach(function (el) {
    if (!values[el.name]) { values[el.name] = []; }
    values[el.name].push({ value: el.value, size: el.size });
  });
  return Object.keys(values).map(function (key) {
    var o = {};
    o[key] = values[key];
    return o;
  });
}

var array2 = collect(array1);

console.log(array2);
document.write(JSON.stringify(array2));

答案 1 :(得分:0)

其中一个问题是,您将make(this)的返回值作为.forEach()的回调传递,即undefined;这个调用是正确的:

array1.forEach(make);

其次,你没有正确地将array2初始化为对象。

var array2 = {};

第三,每个元素都是一个对象,而不是一个数组,所以你应该按名称引用这些字段。最后,如果您想按名称分组,那么您在每次迭代中所做的工作取决于您之前是否看过该名称:

function make(element)
{
    if (!array2[element.name]) {
      array2[element.name] = [];
    }
    array2[element.name].push({value: element.value, size: element.size});
};

var array1 = [{name: "a", value: 1, size: 2},{name: "a", value: 2, size: 3},{name: "b", value: 1 ,size: 4}];
var array2 = {};
function make(element)
    {
        if (!array2[element.name]) {
          array2[element.name] = [];
        }
        array2[element.name].push({value: element.value, size: element.size});
    };
array1.forEach(make);
console.log(array2);