請考慮以下情形;JavaScript數組映射
var defaultArr = ['a', 'b', 'c', 'd'];
var availArr = [];
var selectedArr = [];
如果我傳球達陣一些index
的在參數的值,我要分手了我的數組的
例子:
如果數組索引:0,2
預期結果:
availArr = ['b', 'd'];
selectedArr = ['a', 'c'];
是否有任何默認方法做到這一點?
請考慮以下情形;JavaScript數組映射
var defaultArr = ['a', 'b', 'c', 'd'];
var availArr = [];
var selectedArr = [];
如果我傳球達陣一些index
的在參數的值,我要分手了我的數組的
例子:
如果數組索引:0,2
預期結果:
availArr = ['b', 'd'];
selectedArr = ['a', 'c'];
是否有任何默認方法做到這一點?
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
沿信息,以確定推到其結果數組。
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);
您可以使用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])
你可以使用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);
您可以使用陣列的方法,如的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
}));
由於只有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
數組中的所有元素。
在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);
所有選定條目的陣列可以在一個線經由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']
使用的indexOf和推入改編 – Mahi
過濾器檢查一次索引得到'selectedArr',然後過濾掉不挺的'availArr'以前的謂語? – vlaz
我可以使用'indexOf'來填充'selectedArr'。那麼'availArr'呢? – Ranjith