Javascript 如何将对象转换为复杂的对象数组

Javascript 如何将对象转换为复杂的对象数组,javascript,Javascript,我有一个这样的物体 const data = {offer_4: "5", note_4: "note", offer_6: "5", note_6: "note"} 如果我必须转换成一个数组的对象如下,怎么办 const body = [ { id: 4,// after underline is id is_disabl

我有一个这样的物体

const data = {offer_4: "5", note_4: "note", offer_6: "5", note_6: "note"}
如果我必须转换成一个数组的对象如下,怎么办

const body = [
              {
                id: 4,// after underline is id
                is_disable: //value of offer_4 === undefined ? false : true,
                price: //value of offer_4,
                note: //value of note_4,
              },
              {
                id: 6,// after underline is id
                is_disable: //value of offer_6 === undefined ? false : true,
                price: //value of offer_6,
                note: //value of note_6,
              },
            ];
我们有类似键的offer_4,数字offer“_”是一个id,所以当我有键note_4和offer_4时,它们的值必须在一个对象中 如果报价有一个值,那么被禁用的必须是真值,否则必须是假报价和备注始终在一起 我希望我的解释清楚,

const data={offer_4:“5”,note_4:“note”,offer_6:“5”,note_6:“note”,note_7:“note”}
const reduced=对象。键(数据)。reduce((acc,val)=>{
const id=val.split(“”“)[1];
如果(acc[id])返回acc;
acc[id]={
id,被禁用:数据[`offer\${id}`]==未定义,价格:数据[`offer\${id}`].\124; 0,注意:数据[`note\${id}`]
}
返回acc;
}, {});

console.log(Object.values(reduced))
以下是您需要执行的操作:

const data={offer_4:“5”,note_4:“note”,offer_6:“5”,note_6:“note”,note_7:“note”}
常量结果数组=[];
for(对象的常量键。键(数据)){
如果(关键包括(“报价”)){
const_id=key.split(“”)[1];
常量newItem={
id:_id,
是否禁用:数据[键]==未定义,
价格:数据[键],
注:数据[`note_${{u id}`],
};
结果ray.push(newItem);
}
}

console.log(resultArray)我会尝试使用reduce-note来处理ID7中未定义的提供

const数据={
报价4:“5”,注4:“注”,
报价6:“5”,注6:“注”,
注7:“注”};
const body=Object.keys(数据).reduce((acc,key)=>{
const[dataKey,dataId]=key.split(“”);
让obj=acc.find(({id})=>id==dataId)
if(!obj)acc.push({id:dataId})
obj=附件[附件长度-1];
如果(数据键==“报价”){
obj[“价格”]=数据[键]
}
else obj[dataKey]=data[key];//也将添加任何新密钥
返回acc
},[])
body.forEach(item=>item[“is_disable”]=!item[“price”]);

console.log(body)
您可以使用对象作为累加器进行缩减,并在获得值的情况下对值进行整形

const
数据={报盘4:“5”,注盘4:“注”,报盘6:“5”,注盘6:“注”},
结果=Object.values(Object.entries(data).reduce((r[k,v])=>{
let[type,id]=k.split(“”);
id*=1;
类型
如果(!r[id])r[id]={id,则为_disable:false,price:undefined,注意:undefined};
如果(type=='offer'&&v!==未定义)r[id]。为\u disable=true;
如果(类型=='offer')类型='price';
r[id][type]=v;
返回r;
}, {}));

控制台日志(结果)相当广泛的方法,而且没有那么干净和简短。但我们要做的是:

const数据={
提议4:“5”,
注4:“注”,
提议6:“5”,
注6:“注”
};
让body=[];
函数getByColumn(arr、col、val){
用于(arr的var要素){
if(elem[col]==val){
返回元素;
}
}
返回false;
}
函数removeElemByColumn(arr、col、val){
正文=[];
用于(arr的var要素){
if(elem[col]!==val){
身体推(elem);
}
}
返回体;
}
for(var输入数据){
let field=key.split(“”“)[0];
设id=key.split(“”“)[1];
设值=数据[键];
let is_disable=字段=='offer'&&value>0;
让elem=getByColumn(主体'id',id);
if(elem){
元素[字段]=值;
elem.is_disable=elem.is_disable | | is_disable;
body=removeElemByColumn(body'id',id);
身体推(elem);
}否则{
元素={};
elem.id=id;
元素[字段]=值;
elem.is_disable=is_disable;
身体推(elem);
}
}

控制台日志(主体)请注意,每个
注释
报价
组合将成为一个对象。否则,就不是了

if (acc[id]  
        || (splitValues[0] === "offer" && data[`note_${id}`] === undefined)
        || (splitValues[0] === "note" && data[`offer_${id}`] === undefined)) return acc;
const data={offer_4:“5”,note_4:“note”,offer_6:“5”,note_6:“note”,note_7:“note”}
const result=Object.entries(data.reduce)(acc[key,value])=>{
const splitValues=key.split(“”“);
const id=splitValues[1];
如果(附件[id]
||(splitValues[0]==“offer”&&data[`note_${id}`]==未定义)
||(splitValues[0]==“note”&&data[`offer{id}`]==未定义)返回acc;
acc[id]={
身份证件
已禁用:数据[`offer{id}`]!==未定义,
价格:数据[`offer{id}`],
注:数据[`note_${id}`]
}
返回acc;
}, {});

console.log(Object.values(result))它们之间的相关性在哪里?这不是代码编写服务。显示您的尝试。@Alex我们有类似键的offer_4,数字offer“_”是一个id,所以当我有键note_4和offer_4时,这些值必须在一个中object@mplungjan我测试了所有的anser,这比另一个更好所以,我再次测试所有答案,请添加一个完整的示例,包括和不包括offers,因为未定义的值??if语句阻止它被更新。我的意思是,如果某一天输入对象有
description_4
,那么您必须更新您的代码。无论如何,这是对特定问题的一个很好的回答。用于回答此部分的TNX已禁用:数据[
offer{id}
]!=未定义必须禁用:数据[
offer\u${id}
]==未定义,在我的情况下,offer和note总是在一起,所以不需要条件检查为什么否决?