在对象组之间添加条件元素

Add element conditional between group of objects

我有以下代码来创建一个新数组。

const datos = [{
        "id": "re_alt_sr",
        "quantity": 345,
        "selectable": false
      },
      {
        "id": "re_alt_gen",
        "quantity": 740,
        "selectable": true
      },
      {
        "id": "re2_alw_gen2",
        "quantity": 40,
        "selectable": true
      },
      {
        "id": "re_st_w_show",
        "quantity": 1,
        "selectable": true
      }]
var list = [];
for (const item of datos) {
  list.push({
    name: item.id,
    value: item.quantity,
    is: item.selectable
  })
}

console.log(list)

但是我想添加一个新的元素,其中可以选择。

{"name": "default", "value": 0, "status": true}

留下这样的东西:

[
    {"name": "re_alt_sr", "value": 345, "is": false },
    {"name": "re2_alw_gen2","value": 40,"is": true },
    {"name": "default", "value": 0, "status": true},
    {"name": "re_alt_gen", "value": 740, "is": true},
    {"name": "default", "value": 0, "status": true},
    {"name": "re_st_w_show", "value": 1, "is": true}
]

澄清一点:如您所想:不可选择的是一组,SI-可选择的是另一组。 还会有其他数组都是“不可选择”的,因此您无需向它们添加任何内容。

您可以使用 .reduce(),这是一个很有用的函数,它遍历数组,并将每次迭代的值传递给下一次迭代。

const datos = [{"id": "re_alt_sr","quantity": 345,"selectable": false},{"id": "re_alt_gen","quantity": 740,"selectable": true},{"id": "re_st_w_show","quantity": 1,"selectable": true}];

const list = datos.reduce((acc, val) => {
  // Can't use index here because we may have already 
  // injected extra items into array. So we use length instead
  const prev = acc[acc.length - 1];
  return prev && prev.selectable !== val.selectable ?
    [
      ...acc,
      {"id": "default", "quantity": 0, "status": true},
      val
    ] : 
    [...acc, val];
},[]);

console.log(list)

此解决方案通过使用 if 语句来获取 “介于不可选择和可选择之间的新元素”,从而与现有代码保持接近。 .

本质上,它所做的是跟踪前一项的可选状态,当检测到差异时,它会插入新元素。

const datos = [{
        "id": "re_alt_sr",
        "quantity": 345,
        "selectable": false
      },
      {
        "id": "re_alt_gen",
        "quantity": 740,
        "selectable": true
      },
      {
        "id": "re_st_w_show",
        "quantity": 1,
        "selectable": true
      }]
var list = [];

// Var to track of previous item's selectable state
var previousSelectableState = null; 

for (const item of datos) {
    
    
    // NEW CODE BEGIN
    if ( previousSelectableState !== null) {
        // Not at first item    
        
        if (previousSelectableState !== item.selectable ) {
            // Previous item selectable differs from this one
        
            list.push( {"id": "default", "quantity": 0, "status": true} );
        }
    }
    
    previousSelectableState = item.selectable; // for next iteration
    // NEW CODE END
    
    list.push({
        name: item.id,
        value: item.quantity,
        is: item.selectable
    })

}

console.log(list)