【问题标题】:acessing new object from Object.keys and forEach method javascript从 Object.keys 和 forEach 方法 javascript 访问新对象
【发布时间】:2018-02-23 22:35:48
【问题描述】:

我正在尝试使用结构不佳的现有对象数组(数组?)例如,使用新键和道具创建一个新对象(newobj)。

[{"product":["1009", "name", "price", "image", "description"]},
 {"product":["1004", "name2", "price2", "image2", "description2"]}]

我得到了我想要的结果,但 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));
            });
        });

【问题讨论】:

  • 每次循环都覆盖newobj 的相同属性。所以最终结果将只是上次迭代的值。
  • oldobj 是一个数组,你为什么用Object.keys() 而不是oldobj.forEach()
  • 你想要得到什么结果?
  • 你为什么要把[2]放到description中?不应该是[4]吗?
  • @Barmar 我必须更改新对象 (newobj) 中的属性顺序。原始对象具有不同的属性顺序,我没有提供具有正确顺序的虚拟数据。道歉,谢谢!

标签: javascript express foreach key


【解决方案1】:

如果您想要旧对象的所有值,您需要将newobj 设为对象数组。您可以使用.map() 进行此转换。

对象和数组解构是避免所有这些硬编码索引的便捷方法。并且通过正确命名参数变量,您可以使用对象文字速记更轻松地创建结果对象。

var oldobj = [{
    "product": ["1009", "name", "price", "image", "description"]
  },
  {
    "product": ["1004", "name2", "price2", "image2", "description2"]
  }
];
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);

【讨论】:

  • 是的,但这几乎可以肯定是 OP 在写入 minimal reproducible example 时输入的虚拟数据。
  • @Barmar 完美就是这样,谢谢!感谢您的反馈和解释。
【解决方案2】:

试试这个

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

【讨论】:

    【解决方案3】:

    如果您想将结构不佳的对象数组转换为结构良好的对象数组,您可以使用 VanillaJS 中的Array.prototype.map

    const data = [
      {"product": ["1009", "name", "120", "image", "description"]},
      {"product": ["1004", "name2", "250", "image2", "description2"]},
      {"product": ["1012", "name3", "85", "image3", "description3"]}
    ];
    
    const products = data.map(({ product }) => {
      const [id, name, price, image, description] = product;
    
      return {
        id: Number(id),
        name,
        price: Number(price),
        image: `url${image}.jpg`,
        description
      };
    });
    
    console.log(products);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多