在对象组之间添加条件元素
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)
我有以下代码来创建一个新数组。
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)