【发布时间】:2020-08-23 13:36:22
【问题描述】:
我必须关注数组:
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}
];
使用以下迭代,我可以计算出next 和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;
}
结果如下:
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}
];
基于新的集合,如果指针是increased或decreased,我需要计算每个值
示例:第 3 项的值已增加到 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}
];
预期结果:
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}
示例 2:如果同一指针的值减小到 2。
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}
];
以下结果应遵循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}
到目前为止,我有以下代码:
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;
}
}
上面的代码给出了以下结果:这是错误的
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, …}
最后没有计算,请任何人帮忙。 总数必须为 100。
我有 JsFiddle:https://jsfiddle.net/tanvir_alam_shawn/zm21pLen/144/
【问题讨论】:
-
为什么在索引
3上有18?为什么不在另一个地方,然后为什么不先增加这个值呢? -
@NinaScholz 它必须遵循
next和prev的顺序,因为索引2 已经是指向next的指针 -
我不明白为什么当你实际上有数组索引时你有 prev/next。直接寻址有什么问题?
-
@trincot 请给我一个例子
-
您已经接受了一个答案。但是你肯定可以通过增加“当前”索引来访问“下一个”元素。
标签: javascript arrays iteration