如果我有一个类似于以下内容的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方法。
谢谢。
答案 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]);
}
如果你向这个东西添加大量的元素,循环将会很糟糕。我也没有真正检查排序功能,它可能是错误的。