如何将对象数组与嵌套对象映射,并在最终结果中将值连接在一起



在Javascript中,我试图映射一个具有嵌套对象的对象数组,最终结果应该是一个带有键和值的新对象

例如,在片段下面

const res = [{
criteria: {
min: "25",
max: "100"
}
}, {
criteria: {
min: 0,
max: "85"
},
}, {
criteria: {
min: "10",
max: "85"
},
}, ].map(
(e) => ({
valid: e.criteria
})
)
console.log(res)

该地图以这种方式产生

[
{
"valid": {
"min": "25",
"max": "100"
}
},
{
"valid": {
"min": 0,
"max": "85"
}
},
{
"valid": {
"min": "10",
"max": "85"
}
}
]

我的目标是以下结果

[
{
"valid": ["25 - 100"]
},
{
"valid": ["0 - 85"]
},
{
"valid": ["10 - 85"]
}
]

我不知道如何实现这一点,而且标准可能会像criteria: null一样出现如上所述,我们可以在一个obj中同时具有min和max,或者具有一个只有min或max的对象和一个只有null的obj。

什么是实现我不知道的目标的最佳方式

UPDATE随着进入此阶段的数据被修改为清除,一些信息发生了变化。

以前的数据问题是,当最小值或最大值为0时,会被删除,这会导致系统中出现进一步的问题。

正如一位同事所说的那样,情况如下

  1. 标准:最小值:0最大值:";10〃;它是有效的并且将产生["0-10"]
  2. 条件:min:1000 max:0将给出错误,因此数据中不存在

数据中永远不会出现的最小值或最大值作为单独值

您可以通过以下几个步骤来实现这一点:

  • 获取criteria,默认为空对象{}
  • criteria中获取max, min,排除错误值(即null、false、空字符串(
  • 通过-加入范围
  • 排除错误值
  • 绘制地图并获得最终结果

const res = [
{ criteria: { min: "25", max: "100" } },
{ criteria: { max: "85" } },
{ criteria: { min: "10" } },
{ criteria: { max: "100", min: "" } },
{ criteria: { max: "", min: "" } },
{ criteria: null },
]
.map(({ criteria }) => criteria || {})
.map(({ min, max }) => [min, max].filter(Boolean))
.map(arrOfMinMax => arrOfMinMax.join(" - "))
.filter(Boolean)
.map(valid => ({ valid: [valid] }))
console.log(res)

好吧,你已经达到的一半了

const res = [{
criteria: {
min: "25",
max: "100"
}
}, {
criteria: {
max: "85"
}
},
{
criteria: {
min: "10"
}
}, {criteria: null}, {}
].map(obj => {
if (!obj || !obj.criteria) {
return {valid: null}
} 
const {min, max} = obj.criteria
if (min && max) {
return {valid: [`${min} - ${max}`]}
} 
return {valid: [min || max]}
})

console.log(res)

您可以使用零合并运算符??进行concat。

const
data = [{ criteria: { min: "25", max: "100" } }, { criteria: { max: "85" } }, { criteria: { min: "10" } }, { criteria: {} }],
result = data.map(({ criteria: { min, max } = {} }) => ({ valid: []
.concat(min ?? [], max ?? [])
.join(' - ') || null
}));
console.log(result)
.as-console-wrapper { max-height: 100% !important; top: 0; }

更方便的方法是使用传统的for循环,而不是map;你可以试试下面的样品。

const res = [
{
criteria: {
min: "25",
max: "100"
}
}, 
{
criteria: {
max: "85"
},
},
{
criteria: {
min: "10"
},
}, 
{
criteria: null
}, 
]
let arr = new Array();
for(let i = 0; i< res.length; i++ ){
if (res[i].criteria === null) continue;
let min = res[i].criteria.min, max = res[i].criteria.max;
const str = min && max ? `${min} - ${max}` : min ? min : max ? max : ''
const objWithMaxMin = {
valid: [str]
}
arr.push(objWithMaxMin)
}
console.log(arr)

最新更新