将数组分为从负到正的范围

时间:2018-07-03 08:13:26

标签: javascript arrays

目前,我有一个数组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();

这是我得到的结果

result

我真的在数学上挣扎。我要做的就是将每个对象映射为

阶段(对象)

{
   stage: stage,
   position: position // with the correct range
}

3 个答案:

答案 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
  });
}

如果有人知道更好的方法,请告诉我!