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/