从object.keys和forEach方法javascript访问新对象

从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

我正试图从结构不良的现有对象数组(数组?)中创建一个新对象(newobj),其中包含新的键和道具

我得到了我想要的结果,但newobj不会在forEach方法的范围之外更新(超过1个结果)。我的问题是我没有得到什么?forEach使用这种类型obj的方法是否不正确

    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]
    };
});