更新另一个数组中的数组

时间:2017-10-11 14:42:22

标签: javascript

我有一个JSON数组,表示一个对象列表(人)。 每个对象(每个人)都有名称属性,图像和数字数组。

示例:

"people":[  
   {  
      "name":"nunu",
      "image":"image1",
      "numbers":{  
         "total":50,
         "vector":[  
            10,
            20,
            5,
            10,
            5
         ]
      }
   }
];

我的目标是更新所有向量并为每个向量附加一些计算。

这就是我的尝试:

this.people = this.people.map((person) => {
      return person.numbers.vector.map((num) => {
        return Math.round(((num / divider) * 100) / 100);
      });
    });

问题是people被我vector中的数字所取代,我丢失了人数据。

如何在不对任何其他数据进行任何更改的情况下更新矢量?

4 个答案:

答案 0 :(得分:1)

由于.map() specification它创建了一个新数组,因此要使用.forEach()来处理顶级列表:

this.people.forEach(person => 
  person.numbers.vector = person.numbers.vector.map(num =>
    Math.round(((num / divider) * 100) / 100)
  );
);

答案 1 :(得分:0)

如果你使用新的传播操作符和像Babel这样的东西,这就变得微不足道了:

const source = {
  "people": [{
    "name": "nunu",
    "image": "image1",
    "numbers": {
      "total": 50,
      "vector": [
        10,
        20,
        5,
        10,
        5
      ]
    }
  }]
};

const newSource = {
  ...source,
  people: source.people.map(person => {
    return {
      ...person,
      numbers: {
        ...person.numbers,
        vector: person.numbers.vector.map(n => Math.round(((n / 2) * 100) / 100))
      }
    }
  })
};

以下是spread运算符的更多内容。

作为旁注,使用spread运算符创建一个新对象,并使用map创建一个新数组。这样,您将始终拥有一个新对象,并且无法更改旧对象。将const与此类代码一起使用也是一种很好的做法。

答案 2 :(得分:0)

people = people.map((person) => {
    person.numbers.vector =  person.numbers.vector.map((num) => {
        return Math.round(((num / divider) * 100) / 100);
    });
    return person;
});

您将向量作为person的值返回,您需要更改向量的值然后返回人。

答案 3 :(得分:0)

尝试使用spread运算符更新person对象并保存所有数据。例如,将total值计算为nums的总和:

 this.people = this.people.map((person) => {
   let total = person.numbers.vector.reduce((prevNum, nextNum) => {
     return prevNum + nextNum;
   });

   return {
      ...person,
      numbers: {
         ...person.numbers,
         total
      }

  }
});

以同样的方式可以更改矢量值,例如