目前,我有一个数组levels
,其中包含其他名为level
的数组,而这些数组包含stages
。
我想用一个名为position
的新属性映射关卡中的所有对象。此位置返回距数组中心的距离。居中是 length / 2 。
如果数组的长度是偶数,我想要以下范围
... -3.5,-2.5,-1.5,-0.5,0.5,1.5,2.5,3.5 ...
如果数组长度甚至都不是我想要的范围
... -4,-3,-2,-1,0,1,2,3,4 ...
我开始创建这个
const distanceLevels = [
[{
"id": 1
}, {
"id": 8
}],
[{
"id": 2
}],
[{
"id": 3
}, {
"id": 4
}, {
"id": 5
}, {
"id": 7
}],
[{
"id": 6
}]
];
function getViewLevels() {
const viewLevels = []; // the new array as the result
distanceLevels.forEach(level => { // one level containing the stages
const levelLength = level.length;
const halfLevelLength = levelLength * 0.5;
const levelLengthIsEven = levelLength % 2 == 0;
let viewLevel = []; // the mapped level
if (levelLengthIsEven) {
addViewStage(viewLevel, level[Math.floor(halfLevelLength)], 0);
}
for (let i = 0; i < halfLevelLength; i++) {
let rightPosition = i - halfLevelLength;
let leftPosition = i;
let leftStageIndex = i;
if (levelLengthIsEven) {
leftPosition++;
leftStageIndex += Math.floor(halfLevelLength) + 1;
} else {
rightPosition += 0.5;
leftPosition += 0.5;
leftStageIndex += halfLevelLength;
}
addViewStage(viewLevel, level[i], rightPosition);
addViewStage(viewLevel, level[leftStageIndex], leftPosition);
}
viewLevel = viewLevel.sort((a, b) => a.position > b.position); // sort the result by their position, means from negative to positive
viewLevels.push(viewLevel); // add this new view level
});
console.log(viewLevels); // <---- result here!
}
function addViewStage(viewLevel, stage, position) { // push a new element to the array
viewLevel.push({
stage: stage,
position: position
});
}
getViewLevels();
这是我得到的结果
我真的在数学上挣扎。我要做的就是将每个对象映射为
阶段(对象)
到
{
stage: stage,
position: position // with the correct range
}
答案 0 :(得分:6)
您可以使用两个嵌套的var query = from f in db.FileCommits
join c in db.Commits
on f.CommitID equals c.Id
where (c.WorkspaceId == workspaceId && f.CommitID <= commitId)
select new{f, c};
var listOfFiles = query
.OrderByDescending(p => p.c.Id)
.Select(f => f.f.File)
.Distinct()
.ToList();
来做到这一点:
maps
答案 1 :(得分:1)
尝试一下:
let levels = [
[
{
stage: 1
},
{
stage: 2
},
],
[
{
stage: 1
},
{
stage: 2
},
{
stage: 3
},
],
[
{
stage: 1
},
{
stage: 2
},
{
stage: 3
},
{
stage: 4
},
{
stage: 5
},
],
[
{
stage: 1
},
{
stage: 2
},
]
]
levels.forEach(function(level) {
let len = level.length,
shift = (level.length + 1) / 2;
level.map(function(stage, index) {
stage.position = (index + 1) - shift;
})
});
console.log(levels);
答案 2 :(得分:-1)
所以我刚刚得到了适用的代码
const distanceLevels = [
[{
"id": 1
}, {
"id": 8
}],
[{
"id": 2
}],
[{
"id": 3
}, {
"id": 4
}, {
"id": 5
}, {
"id": 7
}],
[{
"id": 6
}]
];
function getViewLevels() {
const viewLevels = [];
distanceLevels.forEach(level => {
const levelLength = level.length;
const halfLevelLength = Math.floor(levelLength * 0.5);
const levelLengthIsEven = levelLength % 2 == 0;
let viewLevel = [];
if (!levelLengthIsEven) {
addViewStage(viewLevel, level[halfLevelLength], 0);
}
for (let i = 0; i < halfLevelLength; i++) {
let rightPosition = i - halfLevelLength;
let leftPosition = i;
let leftStageIndex = i + halfLevelLength;
if (levelLengthIsEven) {
rightPosition += 0.5;
leftPosition += 0.5;
} else {
leftPosition += 1;
leftStageIndex++;
}
addViewStage(viewLevel, level[i], rightPosition);
addViewStage(viewLevel, level[leftStageIndex], leftPosition);
}
viewLevel = viewLevel.sort((a, b) => a.position > b.position);
viewLevels.push(viewLevel);
});
return viewLevels;
}
function addViewStage(viewLevel, stage, position) {
viewLevel.push({
stage: stage,
position: position
});
}
如果有人知道更好的方法,请告诉我!