Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/372.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 - Fatal编程技术网

Javascript 将对象数组映射到具有数组的分组对象

Javascript 将对象数组映射到具有数组的分组对象,javascript,arrays,object,Javascript,Arrays,Object,我的问题很直截了当,我想,我就是想不出来。我需要从一组对象开始: let testArrays = [ { "containerType": "2 Gallon", "wasteType": "10000001", "vol": "2 Gallons" }, { "containerType": "2 Gallon", "wasteType": "10000001", "vol": "2 Gallons" }, { "containerType": "2 Gallon", "wasteT

我的问题很直截了当,我想,我就是想不出来。我需要从一组对象开始:

    let testArrays = [
{ "containerType": "2 Gallon", "wasteType": "10000001", "vol": "2 Gallons" },
{ "containerType": "2 Gallon", "wasteType": "10000001", "vol": "2 Gallons" },
{ "containerType": "2 Gallon", "wasteType": "10000002", "vol": "2 Gallons" },
{ "containerType": "2 Gallon", "wasteType": "10000002", "vol": "2 Gallons" },
{ "containerType": "2 Gallon", "wasteType": "10000003", "vol": "2 Gallons" },
{ "containerType": "5 Gallon", "wasteType": "10000003", "vol": "5 Gallons" },
{ "containerType": "5 Gallon", "wasteType": "10000003", "vol": "5 Gallons" },
{ "containerType": "5 Gallon", "wasteType": "10000003", "vol": "5 Gallons" },
{ "containerType": "5 Gallon", "wasteType": "10000004", "vol": "5 Gallons" }
]   
到包含数组的分组对象,按上面的“wasteType”和计数分组。通过将计数乘以“vol”中的值来创建卷,我相信通过parsefloat可以得到:

    let wastes = {
        "10000001": [
            {
                "containerType": "2 Gallon",
                "count": 2,
                "vol": "4 Gallons"
            }
        ],
        "10000002": [
            {
                "containerType": "2 Gallon",
                "count": 2,
                "vol": "4 Gallons"
            }
        ],
        "10000003": [
            {
                "containerType": "1 Gallon",
                "count": 1,
                "vol": "2 Gallons"
            },
            {
                "containerType": "5 Gallon",
                "count": 3,
                "vol": "15 Gallons"
            }
        ],
        "10000004": [
            {
                "containerType": "5 Gallon",
                "count": 1,
                "vol": "5 Gallons"
            }
        ],
    }

我知道我应该使用array.map()来实现这一点,但我不知道如何实现。我到处都找过这个具体的例子,但都找不到。非常感谢所有帮助。

您需要使用
reduce
而不是
map

  • 通过数组循环使用
    wasteType
    作为属性名称
  • 如果属性已不在输出对象上,请使用当前元素值初始化
  • 将计数增加1
  • 再次在
    final
    上循环以获得vol,即
    count*vol
let testArrays=[{“containerType”:“2加仑”,“wasteType”:“10000001”,“vol”:“2加仑”},{“containerType”:“2加仑”,“wasteType”:“10000001”,“vol”:“2加仑”},{“containerType”:“2加仑”,“wasteType”:“10000002”,“vol”:“2加仑”},“wasteType”:“2加仑”,“wasteType”:“10000002”,“vol”:“2加仑”},{“containerType”:“2加仑”{“containerType”:“2加仑”,“废物类型”:“10000003”,“体积”:“2加仑”},{“容器类型”:“5加仑”,“废物类型”:“10000003”,“体积”:“5加仑”},{“容器类型”:“5加仑”,“废物类型”:“10000003”,“体积”:“5加仑”},{“容器类型”:“5加仑”,“废物类型”:“10000003”,“体积”:“5加仑”},{“容器类型”:“5加仑”,“废物类型”:“10000004”,“体积”:“5加仑”}]
让final=testarray.reduce((op,{containerType,wasteType,vol})=>{
设obj={containerType,vol,count:0}
op[wasteType]=op[wasteType]| |新映射([[containerType,obj]]
如果(op[wasteType].has(containerType)){
op[wasteType].get(containerType).count++
}否则{
对象计数++
op[wasteType].set(容器类型,obj)
}
返回操作
}, {})
for(让我们输入最终版本){
final[key]=[…final[key].values()].map(value=>{
设{containerType,vol,count}=value
让finalVol=(体积替换(/[.\D+]/g),)*计数)+“加仑”
返回{containerType,vol:finalVol,count}
})
}

console.log(final)
@code-Maniac比我快,下面是我不太成熟的尝试:

testArrays.forEach(el => {
const temp = wastes[el.wasteType];
if (temp) {
    temp.count++;
    temp.vol += el.vol;
} else {
    wastes[el.wasteType] = {
        "containerType": el.containerType,
        "count": 1,
        "vol": el.vol,
    }
}
})


虽然他似乎没有注意到你也要把vol加起来,因为我会去掉单位“加仑”(可能会把它加在键名上)——如果你想保留它,你必须做一些字符串操作,即得到值的长度,减去“加仑”的长度然后得到剩余的第一个碳的子串,转换成数字,加上数字,再加上“加仑”

您可以通过一个
for
循环来实现这一点。我在该循环中所做的是,取一个一对象,检查对象中是否存在
wasteType
的值,如果未找到,则将其与
count:1
一起添加,最初,如果找到,则检查该数组中的
containerType
,如果也找到,则以1递增计数

const数组=[{
“容器类型”:“2加仑”,
“废物类型”:“10000001”,
“体积”:“2加仑”
}, {
“容器类型”:“2加仑”,
“废物类型”:“10000001”,
“体积”:“2加仑”
}, {
“容器类型”:“2加仑”,
“废物类型”:“10000002”,
“体积”:“2加仑”
}, {
“容器类型”:“2加仑”,
“废物类型”:“10000002”,
“体积”:“2加仑”
}, {
“容器类型”:“2加仑”,
“废物类型”:“10000003”,
“体积”:“2加仑”
}, {
“容器类型”:“5加仑”,
“废物类型”:“10000003”,
“体积”:“5加仑”
}, {
“容器类型”:“5加仑”,
“废物类型”:“10000003”,
“体积”:“5加仑”
}, {
“容器类型”:“5加仑”,
“废物类型”:“10000003”,
“体积”:“5加仑”
}, {
“容器类型”:“5加仑”,
“废物类型”:“10000004”,
“体积”:“5加仑”
}]
常量getUniqueArray=(数组)=>{
常量tempObj={};
for(设i=0;i{
返回r.containerType===containerType;
});
如果(索引==-1){
tempObj[wasteType]。推送(obj);
}否则{
tempObj[wasteType][index]。计数+=1;
const foundVol=tempObj[wasteType][index].vol;
常数fVol=+(foundVol.split(“”)[0]);
const newVol=currentVol+fVol;
tempObj[wasteType][index].vol=`${newVol}加仑`;
}
}否则{
tempObj[wasteType]=[obj];
};
}
返回tempObj;
};
const result=getUniqueArray(数组);

控制台日志(结果)欢迎来到Stackoverflow,请阅读。特别注意。确保用正确的标签(编程语言、相关技术等)标记问题。你在发布一个好的问题上投入的精力越多:一个容易阅读、理解的问题,而且这个问题越容易吸引相关的人,你得到帮助的速度就越快。祝你好运你好@alfasin我很抱歉,我问了很多问题,所以我认为这一条提供了足够的信息,但可能没有?。不幸的是,这是一个过程问题,我真的不知道如何从a点到B点,所以我想包括我尝试过的东西会弊大于利。谢谢你