80

If I have an array A = [1, 4, 3, 2] and B = [0, 2, 1, 2], and I want to return a new array (A - B) with values [1, 2, 2, 0], what is the most efficient approach to do this in JavaScript?

5

7 Answers 7

137

If you want to find the set difference between two sets, that is, you want all the elements of A that are not in B:

const A = [1, 4, 3, 2]
const B = [0, 2, 1, 2]
console.log(A.filter(n => !B.includes(n)))

If you want arithmetic differences between the elements of A and the corresponding elements of B, then please look to the other posted answers.

Sign up to request clarification or add additional context in comments.

4 Comments

This is NOT what rrbest is asking for.
@danger89, agree with you, as a simple solution for this (in case both arrays have the same length): ArrA.map((n, i) => n - ArrB[i]);
By searching for "subtract array" I actually was looking for this answer, lol. Thanks
It may not be what the original question was asking for, but it sure is what most people landing here from google are asking for, judging by the relative upvotes.
48

Use map method The map method takes three parameters in it's callback function like below

currentValue, index, array

var a = [1, 4, 3, 2],
  b = [0, 2, 1, 2]

var x = a.map(function(item, index) {
  // In this case item correspond to currentValue of array a, 
  // using index to get value from array b
  return item - b[index];
})
console.log(x);

1 Comment

es6 version: var x = a.map((item, index) => item - b[index])
8

For Simple and efficient ever.

Check here : JsPref - For Vs Map Vs forEach

var a = [1, 4, 3, 2],
  b = [0, 2, 1, 2],
  x = [];

for(var i = 0;i<=b.length-1;i++)
  x.push(a[i] - b[i]);
  
console.log(x);

3 Comments

Both arrays length, suppose to be same. otherwise it can create a problem. Or handle it before.
@AvneshShakya Yes. Both array should be same and that's what asked.
Strange, for me the JsPerf above doesn't show the for loop as fastest. So I made my own: jsperf.com/for-loop-vs-map-vs-for-each-kce and found that for large n the for loop is many times faster.
3
const A = [1, 4, 3, 2]
const B = [0, 2, 1, 2]
const C = A.map((valueA, indexInA) => valueA - B[indexInA])
console.log(C) // [1, 2, 2, 0]

Here the map is returning the substraction operation for each number of the first array.

Note: this will not work if the arrays have different lengths

1 Comment

As it’s currently written, your answer is unclear. Please edit to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers in the help center.
2

One-liner using ES6 for the array's of equal size in length:

 let subResult = a.map((v, i) => v - b[i]); // [1, 2, 2, 0] 

v = value, i = index

Comments

1

If you want to override values in the first table you can simply use forEach method for arrays forEach. ForEach method takes the same parameter as map method (element, index, array). It's similar with the previous answer with map keyword but here we are not returning the value but assign value by own.

var a = [1, 4, 3, 2],
  b = [0, 2, 1, 2]
  
a.forEach(function(item, index, arr) {
  // item - current value in the loop
  // index - index for this value in the array
  // arr - reference to analyzed array  
  arr[index] = item - b[index];
})

//in this case we override values in first array
console.log(a);

Comments

0
function subtract(operand1 = [], operand2 = []) {
console.log('array1', operand1, 'array2', operand2);
const obj1 = {};

if (operand1.length === operand2.length) {
    return operand1.map(($op, i) => {
        return $op - operand2[i];
    })
}
throw new Error('collections are of different lengths');
}

// Test by generating a random array
function getRandomArray(total){
const pool = []
for (let i = 0; i < total; i++) {
    pool.push(Math.floor(Math.random() * total));
}

return pool;
}
console.log(subtract(getRandomArray(10), getRandomArray(10)))

Time Complexity is O(n) You can also compare your answer with a big collection of arrays.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.