-2

既知のオブジェクト値に基づいて、オブジェクトの配列からクローゼット 2 要素を検索する関数を探しています。この関数は、最も近い 2 つの要素のインデックスを返すか、直接一致する場合は 1 つのインデックスを返します。各要素の p 変数で検索します。

(p 変数が複数回出現しないと想定しても安全です)

var orbit = [ // p is percent
    { p:   0, x:   0, y:   0, z: 1.2 }  
    { p:  30, x:  30, y: 100, z: 0.5 }  
    { p:  45, x: 100, y:  30, z: 0.7 }  
    { p:  75, x:  60, y:   0, z: 1.0 }  
    { p: 100, x:   0, y:   0, z: 1.2 }  
];

function ValueToIndexes (value) {
    return [close1, close2];
};

値が 60 の場合は [2,3] を返し
、値が 30 の場合は [1] を返します。

4

2 に答える 2

1
var ValueToIndices = function (orbit, value) {

    var 
        /* storage for distances */
        distances = [],

        /* sort helper */ 
        sortByDistance = function (a, b) {
            return a.d - b.d;
        };

    /* iterate over orbit */
    for (var i = 0; i < orbit.length; i++) {

        /* a direct match returns immediately */
        if (orbit[i].p === value) {
            return [i];
        }

        /* else collect all distances to the value */
        distances.push({
            i: i,
            d: Math.abs(orbit[i].p - value)
        });
    }

    /* sort the distances */
    distances.sort(sortByDistance);

    /* return the indices of the first two */
    return [distances[0].i, distances[1].i];
};
于 2012-06-13T15:01:59.477 に答える
1

おそらくこのようなもの:

function ValueToIndexes(orbit, value) {
    var sorted = orbit.sort(function (obj1, obj2) {
        return Math.abs(obj1.p - value) - Math.abs(obj2.p - value);
    });

    if (sorted[0].p === value)
        return [sorted[0]];

    return [sorted[0], sorted[1]];
};
于 2012-06-13T06:31:05.230 に答える