【问题标题】:JavaScript: Creating 2 dimensional array of objects based on conditionJavaScript:根据条件创建二维对象数组
【发布时间】:2019-06-13 06:08:46
【问题描述】:

我正在从事一个涉及二维对象数组的项目。我一直在努力尝试找出这个答案一段时间,我对如何解决它有一些想法,但我有点难过。

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

我可以使用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
        }
    }
})

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

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 animal_shelter_capacity =&lt; 50; 对你有什么用。但我确实认为你需要去let capacity = 50 并检查结果值是否大于capacity

标签: javascript arrays loops object foreach


【解决方案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);

【讨论】:

  • 更新:检查最新的避难所。如果没有避难所(第一次迭代)或添加当前位置会超出容量,则使用当前位置开始新的避难所列表并重置计数器。如果避难所可以接收该位置的动物,则将其添加到该避难所。更新计数器。循环后不再需要添加东西
【解决方案2】:

您可以使用reduce() 来解决此问题,使用自定义对象作为初始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 上的)将不会出现在避难所阵列中。所以,我们必须手动放置(这就是额外的行所做的)。

【讨论】:

    【解决方案3】:

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

    你可以有一些数据,比如:

    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 = 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 );

    【讨论】:

      猜你喜欢
      • 2021-06-16
      • 2021-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-18
      • 2015-01-07
      • 1970-01-01
      • 2013-01-02
      相关资源
      最近更新 更多