JavaScript:基于条件创建二维对象数组

JavaScript:基于条件创建二维对象数组,javascript,arrays,loops,object,foreach,Javascript,Arrays,Loops,Object,Foreach,我正在做一个涉及二维物体阵列的项目。我一直在努力找出这个答案,现在,我有一些想法如何解决它,但我有点困惑 假设A市有动物收容所,每个收容所可以容纳50只动物。动物来自该州的不同地区,但一个地方的动物数量永远不会超过50只。这里有一个动物进来的例子 let animal_shelter_capacity =< 50; let array 1 = [ { "region": "NE", quantity: 25 }, { "region": "NW", quantity: 21 },

我正在做一个涉及二维物体阵列的项目。我一直在努力找出这个答案,现在,我有一些想法如何解决它,但我有点困惑

假设A市有动物收容所,每个收容所可以容纳50只动物。动物来自该州的不同地区,但一个地方的动物数量永远不会超过50只。这里有一个动物进来的例子

let animal_shelter_capacity =< 50;

let array 1 = [
  { "region": "NE", quantity: 25 },
  { "region": "NW", quantity: 21 },
  { "region": "SE", quantity: 43 },
  { "region": "SW", quantity: 18 },
  { "region": "Central", quantity: 20} 
]
我可以使用
forEach
array1
中循环,但是当涉及到添加直到达到某个值,然后创建一个新的数组时,我有点困惑于如何继续这样做

以下是我目前掌握的情况:

let array2 = [] //instantiate array

array1.forEach(function(element, index, array)
{
    let sum = 0;
    let capacity = 50;

    for (let j = 0; j < array1.length; j++)
    {
        sum += array1[j].quantity;
        if (sum >= capacity)
        {
            //create the new array consisting of the regions, push it into the larger array2
        }
    }
})

有人能就如何进行提供建议吗?

试试这个。在避难所中循环,如果合适,将其添加到当前避难所列表中。如果没有,保存当前的避难所名册并开始新的名册。循环完成后,确保保存正在写入的当前花名册

const位置=[{
“区域”:“NE”,
“数量”:25
},
{
“区域”:“西北”,
“数量”:21
},
{
“区域”:“SE”,
“数量”:43
},
{
“区域”:“西南”,
“数量”:18
},
{
“区域”:“中部”,
“数量”:20
}
]
常数shelteroster=[];
常数容量=50;
让计数=0;
对于(让位置的位置){
避风塘=避风塘[避风塘长度-1];
如果(!避难所| |计数+位置.数量>容量){
shelterRoster.push([位置]);
计数=0;
}否则{
掩体。推(位置);
}
计数+=位置。数量
}

控制台日志(shelterRoster)
您可以使用自定义对象作为初始的
累加器来处理此问题。当reduce完成时,您需要额外执行一行代码以获得最终结果

const动物收容所容量=50;
常数数组1=[
{“区域”:“NE”,数量:25},
{“地区”:“西北”,数量:21},
{“区域”:“SE”,数量:43},
{“地区”:“西南”,数量:18},
{“地区”:“中部”,数量:20}
];
设obj=array1.reduce((res,curr)=>
{
let试验=(当前数量+res.c>=动物庇护所容量);
返回{
r:测试?[…res.r,res.a]:res.r,
c:测试?当前数量:res.c+当前数量,
测试?[curr]:[res.a,curr]
};
},{r:[],c:0,a:[]});
设newArr=[…对象r,对象a];

控制台日志(newArr)我想到的第一点是,您需要首先对输入数据进行排序。因为您的给定输入(如问题中所述)不是获取数据的唯一可能方式

您可以获得以下数据:

let array1 = [ 
{ "region": "NE", quantity: 25 },
{ "region": "NW", quantity: 21 },
{ "region": "Central", quantity: 20 },
{ "region": "SE", quantity: 43 },
{ "region": "SW", quantity: 18 },
]
在本例中,我们应该将centralSW推到一起,但不首先对输入进行排序将导致centralSW出现在不同的数组中

所以,结论。我想这会有用的:

var make=函数(arr){
var res=[],
currentArr=[];
arr.forEach(v=>{
总和+=v.数量;
如果(总和){
返回a.数量-b.数量;
});
控制台日志(array1);
结果=制造(阵列1);

console.log(result);
我不确定这个
让动物避难所容量=<50;
对你有什么作用。但我确实认为你需要选择
让容量=50
并检查结果值是否大于容量。更新:检查最新的避难所。如果没有避难所(第一次迭代)或者添加当前位置会超出容量,请使用当前位置启动一个新的收容所列表并重置计数器。如果收容所可以收容该位置的动物,则将其添加到该收容所。更新计数器。无需在循环后再添加内容
1. find a way to cut off the addition sequence once the quantity reaches 50
2. reset the sequence 
3. form the new arrays and push them into a larger array
let array1 = [ 
{ "region": "NE", quantity: 25 },
{ "region": "NW", quantity: 21 },
{ "region": "Central", quantity: 20 },
{ "region": "SE", quantity: 43 },
{ "region": "SW", quantity: 18 },
]