如何将源数组指定元素覆盖复制到目标数组对象?
解决方案:转换数组对象为指定结构
你的需求是把obj1中的每个元素映射成{title: name, body: date}的结构,替换dest的内容。之前的Object.assign用法不对,因为它无法处理数组的遍历,而且你错误地直接访问了数组的name属性(数组本身没有这个属性,每个元素才有)。
这里有两种简洁的实现方式:
方式1:使用Array.map()生成新数组(推荐)
map()方法会遍历源数组的每个元素,返回一个全新的转换后的数组,直接赋值给dest即可:
var obj1 = [ { "id": 1373744172, "name": "Run", "distance": 6051.8, "date": "2018-01-24T16:43:09Z", }, { "id": 1370355715, "name": "Swim", "distance": 1043, "date": "2018-01-22T21:10:28Z", } ] var dest = obj1.map(item => ({ title: item.name, body: item.date })); console.log(JSON.stringify(dest));
运行后会得到你想要的结果:
[ {"title":"Run","body":"2018-01-24T16:43:09Z"}, {"title":"Swim","body":"2018-01-22T21:10:28Z"} ]
方式2:修改原dest数组(如果需要保留原数组引用)
如果dest在其他地方被引用,不能直接重新赋值,可以先清空原数组,再逐个添加转换后的元素:
var obj1 = [ { "id": 1373744172, "name": "Run", "distance": 6051.8, "date": "2018-01-24T16:43:09Z", }, { "id": 1370355715, "name": "Swim", "distance": 1043, "date": "2018-01-22T21:10:28Z", } ] var dest = [ {title: "Placeholder", body: "1900-01-01T00:00:00Z"} ] // 清空原数组 dest.length = 0; // 遍历obj1,转换后添加到dest obj1.forEach(item => { dest.push({ title: item.name, body: item.date }); }); console.log(JSON.stringify(dest));
为什么之前的方法无效?
Object.assign主要用于合并对象,你试图用它处理数组,并且错误地访问了obj1.name——obj1是数组,没有name属性,只有数组里的每个元素才有name和date属性。- 你需要遍历数组的每个元素,对每个元素进行结构转换,而不是直接操作整个数组。
内容的提问来源于stack exchange,提问作者George
相关产品推荐
相关产品推荐

