2012-02-14 9 views
0

に基づいてインデックスのJavaScriptオブジェクトに行をスプライシング?は、その値

など。私が挿入したい行にデータ[122,65]が含まれている場合、すべての行の最初の値に対して値 '122'をテストし、次に返されたインデックスに行をスプライスする必要があります。各行値の2番目の値(上記の例では50,50,50)は考慮に入れないでください。この場合、newdデータは148より小さく、25よりも大きいので2行目として挿入する必要があります。前の2行目が3行目になります。

私は、これは今日のことであり、次のコードに遭遇しましたが、これは私の後ろの機能性を示唆していますが、このインスタンスではうまく機能しません。

function findInsertionPoint(sortedArr, val, comparator) { 
    var low = 0, high = sortedArr.length; 
    var mid = -1, c = 0; 
    while(low < high) { 
     mid = parseInt((low + high)/2); 
     c = comparator(sortedArr[mid], val); 
     if(c < 0) { 
     low = mid + 1; 
     }else if(c > 0) { 
     high = mid; 
     }else { 
     return mid; 
     } 
     //alert("mid=" + mid + ", c=" + c + ", low=" + low + ", high=" + high); 
    } 
    return low; 
} 

/** 
* A simple number comparator 
*/ 
function numComparator(val1, val2) { 
    if(val1 > val2) { 
     return 1; 
    }else if(val1 < val2) { 
     return -1; 
    } 
    return 0; 
} 

上記のコードは、誰もが解決策を考え出すのに役立ちますが、私は、私はとにかくそれを共有するだろうと思った場合、私は知りません。私はもちろん、これを達成するためのjavascript/jQueryメソッドを公開しています。

ありがとうございます。

+0

なぜオブジェクトではなく配列を使用していますか? – epascarello

+0

申し訳ありませんが、私が取り組まなければならないアプリの性質です。それは私の選択ではありません。残念ながら私は、アプリケーション自体のデータ処理方法を変更する立場にはありません。 – gordyr

答えて

1

このコードは大幅に改善される可能性がありますが、これは実際には悪いデザインのためのバンダイです。

var myObj = { 
    0: [0,50], 
    1: [25,50], 
    2: [148,60] 
} 

function makeArray(obj) { 
    var newArray = []; 
    for(var x in obj) { 
     newArray.push(obj[x]); 
    } 
    return newArray; 
} 

function makeObject(newArray) { 
    var newObj = {}; 
    for(var i=0, n=newArray.length; i<n; i++) { 
     newObj[i] = newArray[i]; 
    } 
    return newObj; 
} 

function custSortFnc(a,b) { 
    return (a[0]==b[0]) ? a[1]>b[1] : (a[0] > b[0]) ? 1 : -1; 
} 

function addValue(val) { 
    var newArray = makeArray(myObj); 
    newArray.push(val); 
    newArray.sort(custSortFnc); 
    myObj = makeObject(newArray); 
} 

console.log(myObj); 
addValue([122,65]); 

for(var xx in myObj){ 
    console.log(xx + ":" + myObj[xx]); 
} 

この件にたくさんの要素を追加するとループが悪くなります。私も実際にソート機能をチェックしていない、それは間違っている可能性があります。

+0

ありがとうepascarello、これは私が必要とする正確に何かマイナーな修正を加えたものです。その醜い方法で合意しましたが、私は本当に選択肢がありません。それはパフォーマンス上重要ではない小さな機能のためであり、うまくいくはずです。少なくとも、実際のアプリ自体を変更する権限を得るまで。乾杯! – gordyr

1

これは決して適切に機能しません。なぜなら、オブジェクトにはプロパティの定義済みの順序がないからです。

したがって、の注文をに挿入することは、常に機能するとは限りません。注文が重要な場合は配列を使用します。

+0

アレックスに感謝、私はそれほど疑わしい。しかし、このデータを単純な配列に変換し、並べ替えて正しい順序でオブジェクトに変換する方法が潜在的に存在しますか? – gordyr

+0

@gordyrオブジェクトには順序がないので、*正しい*順序でオブジェクトに挿入することはできません。解決策は、オブジェクトの代わりに配列を使用することです –