查找并更新嵌套对象数组中的值

时间:2016-11-21 03:29:48

标签: javascript underscore.js vue.js lodash

我有一个对象数组如下:

products = [
  {
    id: 1,
    title: "Product 1",
    specifications: {
      price: 1.55,
      discount: 15,
      attributes: [
        {
          l1: 100,
          l2: 80
          height:200,
          weight: 15,
          parameters: [
            {
              id: 199199 // this is how I identify the parameter
              size: 185 // this is what I want to change
            }, ... 
          ]    
        }, ...
      ]

    }
  }, ...
]

...以及我要应用的参数的一系列更改,例如:将大小更改为189,其中product.specifications.attributes.parameters.id == 199199。

我想在不夸大任何元素的情况下这样做,因为它们是Vue.js数据结构的一部分,它会破坏反应性。

我怎么能这样做?我愿意使用Underscore或lo-dash

3 个答案:

答案 0 :(得分:1)

_.forEach(products, function(product) {
    _.forEach(_.get(product, 'specifications.attributes', []), function(attribute) {
        _.set(_.find(attribute.parameters, {id: 199199}), 'size', 189);
    });
});

答案 1 :(得分:1)

这看起来很难看,但它很有效:

为了让它更具动态性,让我们使用变量:identifier将是'199199'值,new_size代表'189'值。

methods: {
    updateRecord: function(identifier, new_size) {
        this.products.map(function(product) {   
            product.specifications.attributes.map(function(attribute)           {
                attribute.parameters.map(function(parameter) {
                    if (parameter.id == identifier) parameter.size = new_size;
                })
            });
        });
    }
}

这是一个工作小提琴:https://jsfiddle.net/crabbly/eL7et9e8/

答案 2 :(得分:0)

我相信你想要的是强调findIndex() - http://underscorejs.org/#findIndex。一旦找到要在其中应用更改的数组中的哪个元素(将嵌套的id与您要查找的内容进行比较),您就可以对该特定元素进行更改。