如何调用基于条件的更新值通过递归调用或更好的方法在javascript中调用

ar7v8xwq  于 2023-06-20  发布在  Java
关注(0)|答案(1)|浏览(102)

我有一个对象数组arrobj,参数paramid
如果id在列表中相同,则使其值为null
存储前一个值preValue
然后只为那些preValue > val更新其他对象val
(值被更新,如val、val+1、val+2、val+3...)
返回arrobj,如何用javascript实现

example1

let paramid = 28
const arrObj = [
  { id: 10, val: null }, 
  { id: 13, val: 1 }, 
  { id: 14, val: 2 },
  { id: 25, val: 5 },
  { id: 23, val: 8 },
  { id: 43, val: 7 },
  { id: 28, val: 6 },
  { id: 26, val: 10 }
];

In this example, since id and paramid same,  

  val will be null, { id: 28, val: null } preValue = 6

In the list check preValue > val, there are three Objects,  

  { id: 23, val: 8 }, // updated to 7 (preVal+1)
  { id: 43, val: 7 }, // updated to 6 (preVal)
  { id: 26, val: 10 } // updated to 8 (preVal+2)


Expected Output

[
  { id: 10, val: null }, 
  { id: 13, val: 1 }, 
  { id: 14, val: 2 },
  { id: 25, val: 5 },
  { id: 23, val: 7 },
  { id: 43, val: 6 },
  { id: 28, val: null },
  { id: 26, val: 8 }
];

example 2

let paramid = 28
const arrobj = [
  { id: 10, val: null },
  { id: 13, val: 1 },
  { id: 14, val: 2 },
  { id: 25, val: 10 }, 
  { id: 23, val: 6 },
  { id: 43, val: 7 },
  { id: 28, val: 4 }
];

Expected Output

[
  { id: 10, val: null },
  { id: 13, val: 1 },
  { id: 14, val: 2 },
  { id: 25, val: 6 }, 
  { id: 23, val: 4 },
  { id: 43, val: 5 },
  { id: 28, val: null }
];

example 3
paramid = 14
arrobj = [
  { id: 10, val: null },
  { id: 13, val: 1 },
  { id: 14, val: 3 }
  { id: 16, val: 2 }
]

Expected Output

[
  { id: 10, val: null },
  { id: 13, val: 1 },
  { id: 14, val: null }
  { id: 16, val: 2 }
]
Tried
const getSameId =  arrobj(e=>e.id === paramid);

let oldValue = getSameId.val;

for (let item of arrobj) {
  const index = arrobj.index(item)
  if(item.id === paramid) {
   ...item,
   val: null 
  }
  if(item.id !== paramid && oldValue > item.val) {
   ...item,
   val: oldValue + 1 
  }
}
ne5o7dgx

ne5o7dgx1#

总而言之,代码在arrObj数组中搜索具有特定id值(paramid)的对象。如果找到,它将相应的瓦尔属性设置为null,并递归地查找数组中下一个更高的值。它更新下一个更高值的瓦尔属性,并重复该过程,直到没有找到更高的值。

let paramid = 28
const arrObj = [
    { id: 10, val: null }, 
    { id: 13, val: 1 }, 
    { id: 14, val: 2 },
    { id: 25, val: 5 },
    { id: 23, val: 8 },
    { id: 43, val: 7 },
    { id: 28, val: 6 },
    { id: 26, val: 10 }
];

let increment = 0;
let preVal = 0;
for (let item of arrObj) {
  if(item.id === paramid) {
    preVal = item.val;
    item.val = null;
    findFirstHigherVal(preVal);
  }
}

function findFirstHigherVal(value) {
    let firstObj = undefined;
    for (let item of arrObj) {
        if(item.val > value) {
       

 if(firstObj === undefined || firstObj.val > item.val)
            firstObj = {id: item.id, val: item.val} 
        }
    }
    if(firstObj !== undefined) {
        for (let item of arrObj) {
            if(item.id === firstObj.id) {
                item.val = preVal + increment;
                increment ++;
                break;
            }
        }
        findFirstHigherVal(preVal + increment - 1);
    }
}

相关问题