Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将多维数组转换为单个数组(Javascript)_Javascript_Arrays_Object_Multidimensional Array - Fatal编程技术网

将多维数组转换为单个数组(Javascript)

将多维数组转换为单个数组(Javascript),javascript,arrays,object,multidimensional-array,Javascript,Arrays,Object,Multidimensional Array,我有一个对象数组(来自一个XLSX.js解析器,所以它的长度和内容各不相同),表示已授予项目的授权 简化后,它看起来像这样: var grants = [ { id: "p_1", location: "loc_1", type: "A", funds: "5000" }, { id: "p_2", location: "loc_2", type: "B", funds: "2000" }, { id: "p_3", location: "loc_3", type: "C

我有一个对象数组(来自一个XLSX.js解析器,所以它的长度和内容各不相同),表示已授予项目的授权

简化后,它看起来像这样:

var grants = [
    { id: "p_1", location: "loc_1", type: "A", funds: "5000" },
    { id: "p_2", location: "loc_2", type: "B", funds: "2000" },
    { id: "p_3", location: "loc_3", type: "C", funds:  "500" },
    { id: "p_2", location: "_ibid", type: "D", funds: "1000" },
    { id: "p_2", location: "_ibid", type: "E", funds: "3000" }
];
var res = {};

$.each(grants, function (key, value) {
    if (!res[value.id]) {
        res[value.id] = value;    
    } else {
        res[value.id].type = [res[value.id].type, value.type];
        res[value.id].funds = [res[value.id].funds, value.funds];
    }
});

var projects = []
projects = $.map( res, function (value) { return value; } );
我需要将它们合并到一个新数组中,该数组如下所示:

var projects = [
    { id: "p_1", location: "loc_1", type: "A", funds: "5000" },
    { id: "p_2", location: "loc_2", type: ["B", "D", "E"], funds: ["2000", "1000", "3000"] },
    { id: "p_3", location: "loc_3", type: "C", funds: "500" }
];
。。。因此,当
id
相同时,它将合并对象并将它们的一些键值(在示例
type
funds
中)组合成一个简单的子数组。这些合并对象中的其他键(
location
)继承第一个实例中的值,并忽略其余的值

在几次失败的尝试和大量的在线搜索之后,我从中得到了一个想法,即循环使用
grants
,如下所示:

var grants = [
    { id: "p_1", location: "loc_1", type: "A", funds: "5000" },
    { id: "p_2", location: "loc_2", type: "B", funds: "2000" },
    { id: "p_3", location: "loc_3", type: "C", funds:  "500" },
    { id: "p_2", location: "_ibid", type: "D", funds: "1000" },
    { id: "p_2", location: "_ibid", type: "E", funds: "3000" }
];
var res = {};

$.each(grants, function (key, value) {
    if (!res[value.id]) {
        res[value.id] = value;    
    } else {
        res[value.id].type = [res[value.id].type, value.type];
        res[value.id].funds = [res[value.id].funds, value.funds];
    }
});

var projects = []
projects = $.map( res, function (value) { return value; } );
它实际上工作得很好,只是因为我需要一个数组,所以我把
.join(',')
从末端(从上面提到的答案中)删除了,这反过来又产生了我现在似乎无法解决的问题。如果子数组中至少有三个项,子数组会以某种方式相互嵌套!我有点理解为什么(循环),但我想知道是否有办法将对象中的所有这些小多维数组转换为单格数组(比如:
类型:[“B”、“D”、“E”]

var授权=[
{id:“p_1”,地点:“loc_1”,类型:“A”,资金:“5000”},
{id:“p_2”,地点:“loc_2”,类型:“B”,资金:“2000”},
{id:“p_3”,地点:“loc_3”,类型:“C”,资金:“500”},
{id:“p_2”,地点:“_同上”,类型:“D”,资金:“1000”},
{id:“p_2”,地点:“_同上”,类型:“E”,资金:“3000”}
];
var res={};
美元。每个(授权、功能(键、值){
如果(!res[value.id]){
res[value.id]=值;
}否则{
res[value.id].type=[res[value.id].type,value.type];
res[value.id].funds=[res[value.id].funds,value.funds];
}
});
var项目=[]
projects=$.map(res,函数(值){返回值;});
$(“pre”).html(JSON.stringify(projects,null,2))

您只需更改以下行:

 res[value.id].type = [res[value.id].type, value.type];
 res[value.id].funds = [res[value.id].funds, value.funds];
为此:

Array.isArray(res[value.id].type) ? res[value.id].type.push(value.type) : res[value.id].type = [res[value.id].type, value.type];
Array.isArray(res[value.id].funds) ? res[value.id].funds.push(value.funds) : res[value.id].funds = [res[value.id].funds, value.funds];

我提出这个解决办法

它具有查找功能,如果项目数组中存在索引,如果存在,则推送类型和资金如果不存在,则类型和资金属性将更改为数组,值作为第一个元素

var授权=[
{id:“p_1”,地点:“loc_1”,类型:“A”,资金:“5000”},
{id:“p_2”,地点:“loc_2”,类型:“B”,资金:“2000”},
{id:“p_3”,地点:“loc_3”,类型:“C”,资金:“500”},
{id:“p_2”,地点:“_同上”,类型:“D”,资金:“1000”},
{id:“p_2”,地点:“_同上”,类型:“E”,资金:“3000”}
],
项目=[];
grants.forEach(职能(a){
!项目。一些(功能(b,i){
如果(a.id==b.id){
项目[i].type.push(a.type);
项目[i].funds.push(a.funds);
返回true;
}
})&&project.push({id:a.id,location:a.location,type:[a.type],funds:[a.funds]});
});
document.write(''+JSON.stringify(project,0,4)+'')这是个主意吗

var授权=[
{id:“p_1”,地点:“loc_1”,类型:“A”,资金:“5000”},
{id:“p_2”,地点:“loc_2”,类型:“B”,资金:“2000”},
{id:“p_3”,地点:“loc_3”,类型:“C”,资金:“500”},
{id:“p_2”,地点:“_同上”,类型:“D”,资金:“1000”},
{id:“p_2”,地点:“_同上”,类型:“E”,资金:“3000”}
];
var=[];
//映射并推送到连接
grants.map(
功能(五){
如果(!(本节中的v.id)){
这个[v.id]=v;
连接。推(v);
}否则{
var电流=此[v.id];
current.type=[v.type].concat(current.type);
current.funds=[v.funds].concat(current.funds);
}
}, {}
);
//表现出来
document.querySelector(“#result”).textContent=
stringify(连接,空,”)
这样做可以:


非常感谢,这正是我想要的!优雅而敏捷。(为了将来的参考,我把完整的代码保存在一个小提琴中:)也谢谢你!这还可以从只包含一项的数组中创建一个数组,这在以后的项目中可能会很有用。我也喜欢你摆脱了不必要的jQuery!:(我确实投了你的票,但是我没有足够的代表来显示我的投票。)谢谢!这也很有效。虽然代码中也包含了“location”,我不需要将其堆叠在数组中,但我只是删除了该行,它给出了所需的结果。我把它保存在这里:很高兴我能帮上忙。我意识到映射/连接可以大大简化(请参见编辑的答案),在尝试了这里的所有答案之后,我实际上决定使用这种方法,因为在我的所有代码的其余部分中,这种方法产生了最简单的逻辑,而最后证明也是最短的。(然而,我面临的另一个问题是:)谢谢!这同样有效。这个逻辑让我想起了@nina scholz的解决方案。我也把这个保存在这里了