2016-11-22 124 views
4

請考慮以下情形;JavaScript數組映射

var defaultArr = ['a', 'b', 'c', 'd']; 
var availArr = []; 
var selectedArr = []; 

如果我傳球達陣一些index的在參數的值,我要分手了我的數組的

例子:

如果數組索引:0,2

預期結果:

availArr = ['b', 'd']; 
selectedArr = ['a', 'c']; 

是否有任何默認方法做到這一點?

+0

使用的indexOf和推入改編 – Mahi

+0

過濾器檢查一次索引得到'selectedArr',然後過濾掉不挺的'availArr'以前的謂語? – vlaz

+0

我可以使用'indexOf'來填充'selectedArr'。那麼'availArr'呢? – Ranjith

回答

5

Failrly容易Array.reduce

var defaultArr = ['a', 'b', 'c', 'd']; 
 
var indexes = [0,2]; 
 

 
var result = defaultArr.reduce(function(p, c, i){ 
 
    if(indexes.indexOf(i)>-1) 
 
    p.selectedArr.push(c); 
 
    else 
 
    p.availArr.push(c); 
 
    return p; 
 
}, {availArr: [], selectedArr:[]});; 
 

 

 
console.log('availArr',result.availArr); 
 
console.log('selectedArr',result.selectedArr);

這工作,因爲reduce需要被傳遞3個參數的回調參數 - 傳遞在我上面的例子

  • p種子對象在
  • c當前陣列元件
  • i當前元素

的索引,並使用該與indexOf沿信息,以確定推到其結果數組。

2

var defaultArr = ['a', 'b', 'c', 'd']; 
 
var availArr = []; 
 
var selectedArr = []; 
 

 

 
function splitArray(indexes) { 
 
    availArr = defaultArr; 
 
    indexes.forEach(function(idx) { 
 
    let item = availArr.splice(idx, 1)[0]; 
 
    selectedArr.push(item); 
 
    }) 
 
} 
 

 
splitArray([0, 2]); 
 

 
console.log(availArr); 
 
console.log(selectedArr);

1

您可以使用array.splice + array.concat實現這一

var defaultArr = ['a', 'b', 'c', 'd']; 
 
var availArr = []; 
 
var selectedArr = []; 
 

 
function parseIndexes(indexArr){ 
 
    var deleteCount = 0; 
 
    availArr = defaultArr.map(x=>x); 
 
    indexArr.forEach(function(i){ 
 
    selectedArr = selectedArr.concat(availArr.splice(i-deleteCount,1)) 
 
    deleteCount++; 
 
    }); 
 
    console.log(availArr, selectedArr) 
 
} 
 

 
parseIndexes([0,2])

4

你可以使用Array#reduceRight和迭代指數陣列。

var defaultArr = ['a', 'b', 'c', 'd'], 
 
    availArr = defaultArr.slice(), 
 
    selectedArr = [], 
 
    indices = [0, 2]; 
 

 
indices.reduceRight(function (_, a) { 
 
    selectedArr.unshift(availArr.splice(a, 1)[0]); 
 
}, 0); 
 

 
console.log(availArr); 
 
console.log(selectedArr);

2

您可以使用陣列的方法,如的forEach包括

var given = ['a', 'b', 'c', 'd']; 
 
var indexes = [0, 2]; 
 
var available = []; 
 
var selected = []; 
 

 
given.forEach(function (v, i) { 
 
    if (indexes.includes(i)) { 
 
    selected.push(v); 
 
    } else { 
 
    available.push(v); 
 
    } 
 
}); 
 

 
document.write(JSON.stringify({ 
 
    given: given, 
 
    available: available, 
 
    selected: selected 
 
}));

0

由於只有Array.filter

var array = ['a', 'b', 'c', 'd']; 
var indexes = [0, 2] 
array.filter(function(el, i) { 
    return indexes.indexOf(i) !== -1 
}); 

// ["a", "c"] 

array元素,對象,字符串的數組......和indexes該數組包含要保留的元素的所有索引,只需從array數組中刪除其ID不在indexes數組中的所有元素。

2

在JS Array.prototype.reduceRight()是迭代數組並通過移除項來變形的理想仿函數。因此,我將如下處理這項工作;

var defaultArr = ['a', 'b', 'c', 'd'], 
 
     indices = [0, 2]; 
 
     result = defaultArr.reduceRight((p,c,i,a) => indices.includes(i) ? p.concat(a.splice(i,1)) : p ,[]); 
 
console.log(defaultArr,result);

0

所有選定條目的陣列可以在一個線經由Array.map獲得:

var defaultArr = ['a', 'b', 'c', 'd'] 
var index = [0,2] 
var selectedArr = index.map(i => defaultArr[i]) //=> ['a', 'c'] 

然後將剩餘的條目的陣列可例如檢索與the Ramda's difference operator

var availArr = R.difference(defaultArr, selectedArr) //=> ['b', 'd']