从object.keys和forEach方法javascript访问新对象
我正试图从结构不良的现有对象数组(数组?)中创建一个新对象(newobj),其中包含新的键和道具 我得到了我想要的结果,但newobj不会在forEach方法的范围之外更新(超过1个结果)。我的问题是我没有得到什么?forEach使用这种类型obj的方法是否不正确从object.keys和forEach方法javascript访问新对象,javascript,express,foreach,key,Javascript,Express,Foreach,Key,我正试图从结构不良的现有对象数组(数组?)中创建一个新对象(newobj),其中包含新的键和道具 我得到了我想要的结果,但newobj不会在forEach方法的范围之外更新(超过1个结果)。我的问题是我没有得到什么?forEach使用这种类型obj的方法是否不正确 var newobj = {}; Object.keys(oldobj).forEach(function(prop) { newobj["id"] = Number(oldobj[prop]["prod
var newobj = {};
Object.keys(oldobj).forEach(function(prop) {
newobj["id"] = Number(oldobj[prop]["product"][0]),
newobj["name"] = oldobj[prop]["product"][1],
newobj["price"] = Number(oldobj[prop]["product"][3]),
newobj["image"] = "url" + oldobj[prop]["product"][0] + ".jpg",
newobj["description"] = oldobj[prop]["product"][2];
// this works
// console.log(JSON.stringify(newobj));
});
// this only updated with one
app.locals.newobj = newobj;
我也尝试过映射(带下划线),但我得到了相同的结果,我无法访问范围之外的内容
_.each(mappedobj, function(prop) {
_.each(prop["product"][0], function(vals){
newobj["id"] = Number(prop["product"][0]);
console.log(JSON.stringify(newobj));
});
});
试试这个
let newObject = _.map(oldObject, (item) => {
return {
id: item.product[0],
name: item.product[1],
price: item.product[2],
image: item.product[3],
description: item.product[4]
};
});
如果要从旧对象中获取所有值,则需要创建
newobj
对象数组。您可以使用.map()
执行此转换
对象和数组解构是避免所有这些硬编码索引的方便方法。通过正确命名参数变量,您可以使用对象文字速记来更轻松地创建结果对象
var oldobj=[{
“产品”:[“1009”、“名称”、“价格”、“图像”、“说明”]
},
{
“产品”:[“1004”、“名称2”、“价格2”、“图像2”、“说明2”]
}
];
var newobj=oldobj.map({product:[id,name,price,url,description]})=>
({id:Number(id),name,price:Number(price),url:`url${url}.jpg`,description})
);
console.log(newobj)
如果要将结构不良的对象数组转换为结构良好的对象数组,可以使用VanillaJS提供的array.prototype.map
:
const数据=[
{“产品”:[“1009”、“名称”、“120”、“图像”、“说明”]},
{“产品”:[“1004”、“名称2”、“250”、“图像2”、“描述2”]},
{“产品”:[“1012”、“名称3”、“85”、“图像3”、“描述3”]}
];
const products=data.map(({product})=>{
const[id,name,price,image,description]=产品;
返回{
id:编号(id),
名称
价格:编号(价格),
image:`url${image}.jpg`,
描述
};
});
控制台日志(产品)
每次通过循环时,您都会覆盖newobj
的相同属性。因此,最终结果将只是上一次迭代的值。oldobj
是一个数组,为什么要使用Object.keys()
而不是oldobj.forEach()
?您试图得到的结果是什么?为什么要将[2]
放入描述中?这不应该是[4]
?@Barmar我必须更改新对象(newobj)中的属性顺序。原始对象具有不同的属性顺序,我没有提供具有正确顺序的伪数据。抱歉,谢谢!是的,但这几乎可以肯定是OP写的伪数据。@Barmar perfect就是这样,谢谢!我感谢您的反馈和解释。
let newObject = _.map(oldObject, (item) => {
return {
id: item.product[0],
name: item.product[1],
price: item.product[2],
image: item.product[3],
description: item.product[4]
};
});