5

配列を操作できる関数を作成しようとしています...

 var myArray = [2, 1, 1, 1, 1];

今はこうであってほしい

[3、1、1、1]

今私の関数は3つのパラメータを受け入れます

  1. ArrayToProcess - 処理される配列です
  2. indexTarget - これは、インデックスによって定義される選択された値です
  3. morphToValue - これは、選択した値にしたい値です。

私の目的は、たとえば indexTarget を受け入れることです

myFunction(myArray,0,3); //myArray is [2, 1, 1, 1, 1]

ご覧のとおり、関数が をループするようにしたいmyArrayので、 に到達するまで配列に数値を追加しようとするmorphToValueため、[3, 1, 1, 1] になり2、最初のインデックス1と獲得する 2 番目のインデックス3morphToValue の超過に追加しすぎると、配列の任意の数値もマイナスになります。

別の例は次のようになります配列が必要です

var myArray = [2, 1, 1, 1, 1];

このようになる

[2, 1, 3];

このようにcall myFunctionを実行することによって

myFunction(myArray,2,3);

どうすればこれを可能にできますか? 配列の最後のインデックスにindexTargetを設定する場合は、配列の最初から繰り返し続けたいので、次のようになります

var myArray = [2, 1, 1, 1, 1];

それはなる

[1, 1, 1, 3]; //when I invoke myFunction(myArray,4,3);

わからないことがあればコメントください。...

これは私がこれまでに試したことですhttp://jsfiddle.net/eESNj/

var myArray = ['2', '1', '1', '1', '1'];

indexPurge(myArray, 0, 3);

function indexPurge(haystack, indexTarget, morphToValue) {

    var toIntHaystack = [];

    for (var i = 0; i < haystack.length; i++) {
        toIntHaystack.push(parseInt(haystack[i]));
    }

    console.log(toIntHaystack); //before

    var i = 0;

    var purgedValue = 0;

    do {
        console.log(i + ' - ' + toIntHaystack[i]);
        purgedValue += toIntHaystack[i];
        toIntHaystack.splice(i, 1);
        if (purgedValue >= morphToValue) {
            break;
        }
        i++;
    } while (i < toIntHaystack.length);



    toIntHaystack.splice(indexTarget, 0, morphToValue); //after
    console.log(toIntHaystack);

}
4

3 に答える 3

2

これが私のバリアントです。スプライス バリアントよりも高速に動作するはずです。

function fixIdx(idx, len) {
    return idx % len; 
}
function fixStartOffset(idx, len) {
    return (idx < len) ? 0 : (idx % len);
}
function morhArray(inputArray, startIndex, targetValue) {
    var l = inputArray.length;
    var sum = 0;
    var endIdx = 0;
    while ( (sum < targetValue) && (endIdx < l) )
        sum += inputArray[fixIdx(startIndex+endIdx++, l)];
    if (endIdx == l) return [sum];
    var outputArray = [];
    for (var i=fixStartOffset(startIndex+endIdx, l); i<startIndex; i++)
        outputArray.push(inputArray[i]);
    outputArray.push(sum);
    for (var i=startIndex+endIdx; i<l; i++)
        outputArray.push(inputArray[i]);
    return outputArray;
}
于 2013-10-25T03:39:41.243 に答える
1

試す

var myArray = [2, 1, 1, 1, 1];

function myfunction(array, index, target) {
    var copy = array.slice(0);
    var c = 0,
        i = index;
    while (c < target && array.length) {
        c += copy.splice(i, 1)[0];
        if (i == array.length - 1) {
            i = 0;
        }
    }
    if (i == index) {
        copy[index] = c;
    } else {
        copy.push(c);
    }
    return copy;
}

console.log(myfunction(myArray, 0, 3));
console.log(myfunction(myArray, 2, 3))
console.log(myfunction(myArray, 4, 3))

デモ:フィドル

于 2013-10-25T03:21:34.863 に答える