如何创建名称为变量的对象

How to create an object with a variable as it's name?

本文关键字:变量 对象 何创建 创建      更新时间:2023-09-26

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

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));

但是我得到一个错误:"类型错误:无法设置未定义的属性'element[0]'"。我尝试使用Object.defineProperty方法,但无法实现它。如何从阵列 1 到阵列 2

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

其中一个问题是您将 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);

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

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));