JavaScript array mapping

Consider the following scenario:

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

If I pass an array of some value indexto param, I need to split my array

Example:

If the index of the array: 0,2

Expected Result:

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

Is there a default way to do this?

+4
source share
8 answers

Quite easy with 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);
Run codeHide result

This works because it reduceaccepts a callback argument that has 3 arguments passed to it - in my example above

  • p semester object passed to
  • c current array element
  • i index of current item

And uses this information along with indexOfto determine which array of results to click on.

+5
source

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);
Hide result
+4

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);
Hide result
+2

Array, 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
}));
Hide result
+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);
Hide result
+2

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])
Hide result
+1

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.

0

Array.map:

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

Then the array of remaining records can be retrieved, for example. with Ramda difference operator :

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

Source: https://habr.com/ru/post/1661578/


All Articles