JavaScript:根据条件创建对象的二维数组

时间:2019-01-19 00:33:51

标签: javascript arrays loops object foreach

我正在一个涉及二维对象数组的项目中。我一直在努力设法弄清楚这个答案,我对如何解决这个问题有一些想法,但是我有些困惑。

我们假设City 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} 
]

在此示例中,来自NE(25)和NW(21)的动物将转到一个庇护所(总共46只动物),来自SE的动物(43)将前往另一个庇护所(总共43只动物),来自SW(18)和Central(20)的动物将前往第三庇护所(总共38只动物)。一个庇护所中的动物数量不能超过50。

所以,我需要产生一个看起来像这样的数组:

let array2 = [ 
  [ { "region": "NE", quantity: 25 }, { "region": "NW", quantity: 21 }],
  [ { "region": "SE", quantity: 43 } ],
  [ { "region": "SW", quantity: 18 }, { "region": "Central", quantity: 20} ] 
]

我可以使用array1遍历forEach,但是要进行添加直到达到某个值,然后创建一个新的数组数组时,我有些困惑如何进行此操作。

这是我到目前为止所拥有的:

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

我不确定如何继续执行此操作。我知道我需要执行以下操作:

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

任何人都可以就如何进行提供任何建议吗?

3 个答案:

答案 0 :(得分:1)

尝试一下。遍历庇护所(如果适合),将其添加到当前庇护所列表中。如果没有,请保存当前的避难所名册并开始新的避难所名册。循环之后,请确保保存当前正在写入的名册

const locations = [{
    "region": "NE",
    "quantity": 25
  },
  {
    "region": "NW",
    "quantity": 21
  },
  {
    "region": "SE",
    "quantity": 43
  },
  {
    "region": "SW",
    "quantity": 18
  },
  {
    "region": "Central",
    "quantity": 20
  }
]

const shelterRoster = [];
const capacity = 50;
let count = 0;
for (let location of locations) {
  let shelter = shelterRoster[shelterRoster.length - 1];

  if (!shelter || count + location.quantity > capacity) {
    shelterRoster.push([location]);
    count = 0;
  } else {
    shelter.push(location);
  }

  count += location.quantity
}

console.log(shelterRoster);

答案 1 :(得分:0)

您可以使用自定义对象作为初始accumulator,并使用reduce()来实现。还原完成后,您需要多做一行代码才能获得最终结果。

const animal_shelter_capacity = 50;

const array1 = [ 
    {"region": "NE", quantity: 25},
    {"region": "NW", quantity: 21},
    {"region": "SE", quantity: 43},
    {"region": "SW", quantity: 18},
    {"region": "Central", quantity: 20} 
];

let obj = array1.reduce((res, curr) =>
{
    let test = (curr.quantity + res.c >= animal_shelter_capacity);

    return {
        r: test ? [...res.r, res.a] : res.r,
        c: test ? curr.quantity : res.c + curr.quantity,
        a: test ? [curr] : [...res.a, curr]
    };
},{r:[], c:0, a:[]});

let newArr = [...obj.r, obj.a];
console.log(newArr);

在上一个代码中,累积的对象具有下一个键:

  • r :逐渐生成的庇护所阵列。
  • c :当前庇护所的动物柜台(见下)。
  • a :当前的动物庇护所。

reduce完成后,最后一个庇护所(属性a上的庇护所)将不在庇护所阵列中。因此,我们必须手动将其放置(这是多余的行所要做的)。

答案 2 :(得分:0)

我要提出的第一点是,您需要首先对输入数据进行排序。因为您给定的输入(如问题所述)不是获取数据的唯一可能方法。

您可以拥有一些数据,例如:

let array1 = [ 
{ "region": "NE", quantity: 25 },
{ "region": "NW", quantity: 21 },
{ "region": "Central", quantity: 20 },
{ "region": "SE", quantity: 43 },
{ "region": "SW", quantity: 18 },
]

,在此示例中,我们应该将 central SW 放在一起,但不首先对输入进行排序将导致 central SW 在不同的阵列中。

因此,结论。我认为这会起作用:

var make = function( arr ) {
    
        var res = [],
            currentArr = [];

        arr.forEach( v => {

            sum += v.quantity;

            if ( sum <= capacity ) {

                currentArr.push( v );

            } else {

                res.push( currentArr );
                currentArr = [ v ];
                sum = v.quantity;

            }

        });

        res.push( currentArr );

        return res;

    },

    array1 = [

        { "region": "NE", quantity: 25 },
        { "region": "NW", quantity: 21 },
        { "region": "Central", quantity: 20 },
        { "region": "SE", quantity: 43 },
        { "region": "SW", quantity: 18 }

    ],

    sum = 0,
    result,
    capacity = 50;

array1.sort( ( a, b ) => {

    return a.quantity - b.quantity;

});

console.log( array1 );

result = make( array1 );

console.log( result );