这是我想要的,来自这个数组:
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 ??
**我搜索了关于这个主题的类似问题,但找不到我问题的具体答案。
答案 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);