私の脳には数学ニューロンがないので、私はこれを回避する方法を見つけるのに少し苦労しています。
3つのパラメーターを受け取る単純なjavascript関数を作成する必要があります。
- X要素(値は一意のID)を持つ1次元の通常のインデックス付き配列
- 選択するターゲットID
- 返す要素の量
3番目のパラメーターは、要素のセットを返すように関数に要求します。ターゲットIDを持つ要素は、結果の中央または隣にあります。
関数の結果も配列になるはずです。
より視覚的な説明にするためのいくつかの例:
function([100,120,140,160,180,200], 120, 3)
// should return [100,120,140]
function([100,120,140,160,180,200], 160, 4)
// should return [140,160,180,200]
function([100,120,140,160,180,200], 180, 5)
// should return [140,160,180,200,100]
最後の例で取り上げたケースは、私が現在試みているコードを書いているときに私を混乱させるものですが、奇妙な条件、多数のifステートメント、および一般的に回避策のように見えるコードを書いていることに気付きます。また、パラメーター3がパラメーター1の要素の量よりも大きい場合は、私にとっては少し頭がおかしいです。
このコードはバグがあり、単に適切ではないと感じているため、このコードを続行するのは危険だと感じています。確かに、適切な数学のスキルを持っている人は、私がこれをよりエレガントな方法で達成する方法を理解するために必要な理論を私に提供することができます。
理論や擬似コードで十分ですが、誰かがこのようなものを手元に用意している場合は、遠慮なく共有してください。
ありがとう!
(これが私がこれまでに書いたものです-プロトタイプJSクラスの実装に基づいています)
var CBasicMatrix=Class.create({
initialize: function(elementList){
this.elementList=elementList;
},
select: function(id, amount){
if(amount>this.elementList.length)
amount=this.elementList.length;
if(!this.elementList.length) return false;
var elementIndex=this.elementList.indexOf(id);
if(elementIndex==-1) return false;
var isRound=amount%2==0;
var amountHalf=isRound ? (amount/2) : (Math.ceil(amount/2)-1);
// [464,460,462,461,463]
var result=[];
if(elementIndex-amountHalf >= 0) {
var startIndex=(elementIndex-amountHalf);
for(i=startIndex;i<=startIndex+amount;i++){
result.push(this.elementList[i];
}
} else {
// more seemingly stupid iterative code coming here
}
}
});
編集:これをより理解しやすくするために、私は目的を述べます。このコードは、複数の要素(パラメーター3)が同時に表示される一種のスライドショーに使用されることになっています。パラメータ1は、HTML宣言に表示される正しい順序での合計要素(のID)のリストです。パラメータ2は現在選択されている要素であるため、中央に表示されます。