2016-03-11 30 views
0

我有一个数组,看起来是这样的:查找和多维JS数组替换元素W/O型变异的阵列

[ [ {Obj}, {Obj}, {Obj} ], [ {Obj}, {Obj}, {Obj} ] ... ] 

而且我有一个进入的对象,应更换对象之一阵列。我能找到的对象我想用一个for循环更换,使用id财产直接替代它:

function findObject(arr, target) { 
    for (let i = 0; i < arr.length; i++) { 
     for (let j = 0; j < arr[i].length; j++) { 
     if (arr[i][j].id === target.id) 
      arr[i][j] = target; 
     } 
    } 
    } 

    findObject(arr, target); 
    // do stuff with arr 

我怎样才能达到同样的效果,而不突变原始数组,最好用合并对象中返回的新数组一个功能?

这里是为了方便起见,JS小提琴:https://jsfiddle.net/tnpxh8fy/

+1

可能的复制http://stackoverflow.com/questions/2454295/how-to-concatenate-properties-from-multiple-javascript-objects – ratherblue

+0

你支持哪些浏览器? – acbabis

+0

@acbabis只有最新。 –

回答

3

您应该使用.map,这将创建一个新的数组:

function findObject(arr, target) { 
    return arr.map(function(users) { 
    return users.map(function(user) { 
     if (user.id === target.id) { 
     return target; 
     } else { 
     return user; 
     } 
    }); 
    }); 
} 
1

一些复制会做的伎俩:

findObj = function(arrArrObj, needle) { 
    var ret = Array.from(arrArrObj) 
    for (let i in ret) 
    for (let j in i) 
     if (ret[i][j].id === needle.id) { 
     ret[i] = Array.from(ret[i]) // as needed 
     ret[i][j] = needle 
     // break 
     } 
    return ret 
} 
+0

等待,不'var ret = new Array(arrArrObj)'只是将原始数组包装到一个新数组? – jehna1

+0

@ jehna1,是的,那会发生什么。 –

+0

@ jehna1哎呀!编辑。 – Arthur2e5