2017-03-25 55 views
1

我有一个数据结构是这样的:映射超过阵列在阵列对象

let foo = [{ "a": [1,2,3] }] 

我要映射的对象内部的阵列上,该阵列内

// Approach 1: 
foo.map(foo => foo.a.map(val => val + 1)) 

这返回[ [ 2,3,4 ] ]但删除外部对象(我认为这很有趣)。

// Approach 2: 
foo.map(foo => { 
    foo.a = foo.a.map(val => val + 1) 
    return foo 
}) 

这个工作,但也改变了对象本身。

有没有办法做到这一点,它返回正确的值,但不改变作为参数给出的对象?

编辑:

我的使用案例包括:具有此数组中的多个对象:

let bar = [ 
    { "a": [1,2,3] }, 
    { "a": [5,5,5] }, 
    { "a": [10,100,1000] }, 
] 

因此,只要解决了数组内直接并不能真正帮助。

+1

'foo的[0] .a.map(VAL => VAL + 1)' – adeneo

回答

1

您可以使用Object.assign()返回原始对象的副本,并添加修改后的a数组。

let bar = [ 
 
    { "a": [1,2,3]}, 
 
    { "a": [5,5,5] }, 
 
    { "a": [10,100,1000] }, 
 
] 
 

 
let result = bar.map(function(e) { 
 
    return Object.assign({}, e, {a: e.a.map(a => a + 1)}) 
 
}) 
 

 
console.log(bar) 
 
console.log(result)

1

你可以遍历对象的所有条目,并与所有对象和数组递增返回一个新的数组。

let foo = [{ a: [1, 2, 3] }, { b: [7, 8, 9] }], 
 
    result = foo.map(o => Object.assign({}, ...Object.entries(o).map(([k, v]) => ({ [k]: v.map(b => b + 1) })))); 
 

 
console.log(result); 
 
console.log(foo);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1

我会建议你使用Object.assign()时要小心,因为它会在foo打破参考对象,如果它是第一个参数是一个空的对象。根据情况,这可能会或可能不会是你想要的。

如果你想保留参考,你可以简单地做如下操作;

var foo = [{ "a": [1,2,3]}], 
 
    bar = foo.map(o => (o.a = o.a.map(val => val + 1),o)); 
 

 
console.log(bar); 
 
foo[0].x = "whatever"; 
 
console.log(foo); 
 
console.log(bar);

+0

通过 “打破参考” 你是复制数据结构?在这种情况下,我想把对象更多地看作是一个数据结构而不是一个对象,所以我很好。 – hgiesel

+0

另外,我不知道,你可以写这样的箭头功能,太棒了! – hgiesel

+0

@hgiesel对不起,我已经通过在我的答案中引用'Object.assign()'引用的措辞。 – Redu