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



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

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可选择是另一组。将存在其他阵列;"不可选择";所以你不需要添加任何内容

此解决方案通过使用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)

您可以使用.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)

最新更新