我有一个数组数组。
var arr = [[1,2,3,4,5],[2,3,4,5,6],[3,4,5,6,7],[4,5,6,7,8],[5,6,7,8,9], [6,7,8,9,10], [7,8,9,10,11]];
我想在特定索引处的多个项目的前面和后面添加一个新项目。
我想要实现的目标是:
var new_arr = [["x",1,"x",2,3,4,5], [2,3,4,5,"x",6,"x"], [3,4,5,"x",6,"x",7], [4,5,"x",6,"x",7,8], [5,"x",6,"x",7,8,9], ["x",6,"x",7,8,9,10], [7,8,9,10,11]];
问题是,当我使用splice
在迭代数组中插入新项时,索引会发生变化。因为splice
是一种破坏性的功能。
以下是我的尝试:
var result = [];
_.each(arr, function(item, index) {
index_a = item.indexOf(1);
index_b = item.indexOf(6);
var temp_item = item.slice(0);
if(~index_a || ~index_b) {
temp_item.splice(index, 0, "x");
temp_item.splice(index + 2, 0, "x");
if(index_b > -1) {
temp_item.splice(index, 0, "x");
}
}
result.push(item);
}
在上面的迭代中,第一个splice
工作正常。但第二个"x"
未正确放置。我认为原因是对splice
数组的第一个temp_item
s'影响。因为数组中的项目数正在变化。
那么我怎样才能实现我的目标呢?谢谢。
答案 0 :(得分:2)
你能先加第二个吗?这不会改变第一个的索引。
答案 1 :(得分:1)
我认为这可以满足您的需求。拼接较高指数首先维持较低的指数定位
function padArr(val, arr){
arr.forEach(function(subArr){
var idx = subArr.indexOf(val);
if( idx >-1){
subArr.splice(idx+1,0,'x' );
subArr.splice(idx,0,'x')
}
});
return arr;
}
// usage
arr = padArr(1, arr);
arr = padArr(6, arr);
的 DEMO 强>
答案 2 :(得分:1)
我改变了一些事情,但它的工作。 Oriol是正确的indexOf
你永远是-1
。
在我的解决方案中,我映射矩阵并评估每行是否包含1
或6
,如果它确实按索引缓存元素并使用"x",
elm {{拼接索引1}}
"x"
也是一个jsfiddle示例