Je travaille sur un projet qui implique des tableaux d'objets en deux dimensions. Je travaille pour essayer de trouver cette réponse depuis un certain temps maintenant, et j'ai quelques idées sur la façon de la résoudre, mais je suis un peu perplexe.
Supposons qu'il y ait des refuges pour animaux dans City Un et que chacun peut contenir 50 animaux. Les animaux arrivent de différentes parties de l'État, mais le nombre d'animaux d'un endroit ne peut jamais dépasser 50. Voici un exemple d'animaux qui arrivent.
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
Dans cet exemple, les animaux de NE (25) et NW (21) iraient dans un seul refuge (46 animaux au total), les animaux de SE (43) irait dans un autre refuge (43 animaux au total), et les animaux de SW (18) et Central (20) iraient dans un troisième refuge (38 animaux au total). Le nombre d'animaux dans un abri ne peut jamais être supérieur à 50.
Je dois donc produire un tableau qui ressemble à ceci:
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
}
}
})
I je suis capable de parcourir array1 en utilisant forEach , mais quand il s'agit d'ajouter jusqu'à ce qu'une certaine valeur soit atteinte, puis de créer un nouveau tableau de tableaux, je suis un peu Je ne sais pas comment procéder pour faire cela.
Voici ce que j'ai jusqu'à présent:
let array2 = [
[ { "region": "NE", quantity: 25 }, { "region": "NW", quantity: 21 }],
[ { "region": "SE", quantity: 43 } ],
[ { "region": "SW", quantity: 18 }, { "region": "Central", quantity: 20} ]
]
Je ne suis pas sûr de savoir comment continuer. Je sais que je dois faire ce qui suit:
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}
]
Quelqu'un peut-il donner des conseils sur la façon de procéder?
3 Réponses :
Essayez ceci. Parcourez les abris, si cela peut convenir, ajoutez-le à la liste actuelle des abris. Sinon, enregistrez la liste actuelle des abris et créez-en une nouvelle. Après la boucle, assurez-vous de sauvegarder la liste actuelle en cours d'écriture
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);
Mise à jour: vérification du dernier abri. Si aucun abri (première itération) ou l'ajout d'emplacement actuel ne dépasse la capacité, commencez une nouvelle liste d'abris avec l'emplacement actuel et réinitialisez le compteur. Si l'abri peut prendre les animaux de l'emplacement, ajoutez-le à cet abri. Mettre à jour le compteur. Plus besoin d'ajouter quelque chose après la boucle
Vous pouvez aborder cela avec réduire ( ) , en utilisant un objet personnalisé comme accumulateur initial. Une fois la réduction terminée, vous devrez créer une ligne de code supplémentaire pour obtenir votre résultat final.
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);
Sur le code précédent, l'objet accumulé a les clés suivantes:
Lorsque la réduction finira, le dernier abri (celui de la propriété a ) ne sera pas sur le tableau des abris. Donc, nous devons le mettre manuellement (c'est ce que fait la ligne supplémentaire).
Le premier point que j'ai trouvé est que vous devez d'abord trier les données d'entrée. parce que votre entrée donnée (comme demandé dans la question) n'est pas le seul moyen possible d'avoir des données.
Vous pouvez avoir des données comme:
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 );et dans cet exemple , nous aurions dû rapprocher central et SW , mais le fait de ne pas trier l'entrée à la première place entraînera central et SW strong > dans différents tableaux.
Donc, conclusion. Je pense que ça va marcher:
let array1 = [
{ "region": "NE", quantity: 25 },
{ "region": "NW", quantity: 21 },
{ "region": "Central", quantity: 20 },
{ "region": "SE", quantity: 43 },
{ "region": "SW", quantity: 18 },
]
Je ne sais pas comment ce
let animal_shelter_capacity = <50;va fonctionner pour vous. Mais je pense que vous devez aller pourlet capacity = 50et vérifier si la valeur du résultat est supérieure à cettecapacité.