如果我有一个如下所示的 JavaScript 对象:
{
0: [0,50],
1: [25,50],
2: [148,60]
}
如何根据值在索引处插入新行?
例如如果我希望插入的行包含数据 [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 方法。
谢谢。
最佳答案
这段代码可以大大改进,但这确实是一个糟糕设计的创可贴。
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]);
}
如果你向这个东西添加大量元素,循环会很糟糕。我也没有真正检查排序功能,它可能是错误的。
关于javascript - 根据行的值将行拼接到索引处的 Javascript 对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9270000/