基于其值将索引拼接到索引处的Javascript对象中

时间:2012-02-14 00:12:30

标签: javascript jquery arrays

如果我有一个类似于以下内容的javascript对象:

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

如何在依赖于值的索引处插入新行?

E.g。如果我想插入的行包含数据[122,65]我需要测试值'122'与所有行的第一个值,然后'拼接'返回索引处的行。不应考虑每行值的第二个值(上例中为50,50,50)。在这种情况下,新数据应该作为第2行插入,因为它小于148且高于25 ...前一行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方法。

谢谢。

2 个答案:

答案 0 :(得分:1)

由于对象的属性没有定义的顺序,因此永远无法正常工作。

因此,在订单中插入属性并不总是有效。如果订单很重要,请使用数组。

答案 1 :(得分: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]);
}

如果你向这个东西添加大量的元素,循环将会很糟糕。我也没有真正检查排序功能,它可能是错误的。