How can distribute 100 one number at a time

53 Views Asked by At

I have to following array:

var collections=[
    {value:20, next:"", prev: "", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"", prev: "", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"", prev: "", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"", prev: "", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"", prev: "", lastUpdated: false, isLoaked: false, pointer: false}
];

Useing the following iteration, I can calculate the next and prev:

for(i = 0; i < collections.length; i++) {
    collections[i].next = (i+1) % collections.length;
  collections[i].prev = i > 0 ? i-1 : collections.length-1;
}

Following is the result:

var collections=[
    {value:20, next:"1", prev: "3", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"2", prev: "0", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"3", prev: "1", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"4", prev: "2", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"0", prev: "3", lastUpdated: false, isLoaked: false, pointer: false}
];

Based on the new collections, I need to calculate each value if the pointer is increased or decreased

Example: The value for 3rd item has been increased to 25

var collections=[
    {value:20, next:"1", prev: "3", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"2", prev: "0", lastUpdated: false, isLoaked: false, pointer: false},
  {value:25, next:"3", prev: "1", lastUpdated: false, isLoaked: false, pointer: true},
  {value:20, next:"4", prev: "2", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"0", prev: "3", lastUpdated: false, isLoaked: false, pointer: false}
];

Expected Result:

0: {value: 19, next: 1, prev: 4, lastUpdated: true, isLoaked: false, pointer: false}
1: {value: 19, next: 2, prev: 0, lastUpdated: true, isLoaked: false, pointer: false}
2: {value: 25, next: 3, prev: 1, lastUpdated: true, isLoaked: false, pointer: true}
3: {value: 18, next: 4, prev: 2, lastUpdated: true, isLoaked: false, pointer: false}
4: {value: 19, next: 0, prev: 3, lastUpdated: true, isLoaked: false, pointer: false}

Example 2: if the value is decreased to 2 for the same pointer.

var collections=[
    {value:19, next:"1", prev: "3", lastUpdated: false, isLoaked: false, pointer: false},
  {value:19, next:"2", prev: "0", lastUpdated: false, isLoaked: false, pointer: false},
  {value:23, next:"3", prev: "1", lastUpdated: false, isLoaked: false, pointer: true},
  {value:18, next:"4", prev: "2", lastUpdated: false, isLoaked: false, pointer: false},
  {value:19, next:"0", prev: "3", lastUpdated: false, isLoaked: false, pointer: false}
];

Following result is expected which with follow the prev:

0: {value: 20, next: 1, prev: 4, lastUpdated: true, isLoaked: false, pointer: false}
1: {value: 20, next: 2, prev: 0, lastUpdated: true, isLoaked: false, pointer: false}
2: {value: 23, next: 3, prev: 1, lastUpdated: false, isLoaked: false, pointer: true}
3: {value: 18, next: 4, prev: 2, lastUpdated: false, isLoaked: false, pointer: false}
4: {value: 19, next: 0, prev: 3, lastUpdated: false, isLoaked: false, pointer: false}

So far I have the following code:

var collections=[
    {value:20, next:"", prev: "", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"", prev: "", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"", prev: "", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"", prev: "", lastUpdated: false, isLoaked: false, pointer: false},
  {value:20, next:"", prev: "", lastUpdated: false, isLoaked: false, pointer: false}
];
var maxValue = 100;
var totalValue = 0;
var toBeDistributedNext = 0;
var toBeDistributedPrev = 0;

for(i = 0; i < collections.length; i++) {
    collections[i].next = (i+1) % collections.length;
  collections[i].prev = i > 0 ? i-1 : collections.length-1;
}

collections[2].value = 25;
collections[2].pointer = true;

collections.forEach(function (collection) {
  totalValue += parseInt(collection.value);
});

if (totalValue > maxValue) {
    toBeDistributedNext = totalValue - maxValue;
} else {
    toBeDistributedPrev = maxValue - totalValue;
}
var currentPointer = collections.find(item => item.pointer === true);
for (let i = 0; i < toBeDistributedNext; i++) {
  var nextIndex = currentPointer.next;
  if (!collections[i%collections.length].pointer) {
    collections[i%collections.length].value--;
    collections[i%collections.length].lastUpdated = true;
    console.log(collections[i%collections.length])
    //currentPointer = collections[i%collections.length].next;
  }
}

The above code gives the following result: which is WRONG

0: {value: 19, next: 1, prev: 4, lastUpdated: true, isLoaked: false, …}
1: {value: 19, next: 2, prev: 0, lastUpdated: true, isLoaked: false, …}
2: {value: 25, next: 3, prev: 1, lastUpdated: false, isLoaked: false, …}
3: {value: 19, next: 4, prev: 2, lastUpdated: true, isLoaked: false, …}
4: {value: 19, next: 0, prev: 3, lastUpdated: true, isLoaked: false, …}

The last is not calculating, any one please help. The total has to be 100.

I have the JsFiddle: https://jsfiddle.net/tanvir_alam_shawn/zm21pLen/144/

0

There are 0 best solutions below