Как сравнить значения массива и, если они равны, сделать их едиными - PullRequest
0 голосов
/ 14 октября 2019

Привет! Я хочу сравнить значения в массивах, и если они совпадают, я хочу, чтобы они рассматривались как единое целое.

var arrA = [1,1,1,1,2,2,2,3,3,4,4]

var arrB = [0.1,0.1,0.1,0.1 ,0.2,0.2,0.2 ,0.3,0.3 ,0.4,0.4]

Что я хочу сделать, это сравнить значенияarrA, если arrA[i] == arrA[i+1], то он должен рассматривать его как одно значение, а в arrB значения arrB[i] складываются с arrB[i+1].

Мой окончательный массив должен выглядеть следующим образом:

var arrA = [1,2,3,4]

var arrB = [0.4,0.6,0.6,0.8]

Может кто-нибудь помочь мне с кодом JavaScript для этого. Спасибо!

Ответы [ 5 ]

2 голосов
/ 14 октября 2019

Вы можете уменьшить массив и проверить, равно ли предыдущее значение фактическому значению.

function sumSame(arrayA, arrayB) {
    var i,
        l = arrayA.length,
        resultA = [],
        resultB = [];

    for (i = 0; i < l; i++) {
        if (arrayA[i] === arrayA[i - 1]) {
            resultB[resultB.length - 1] += arrayB[i];
        } else {
            resultA.push(arrayA[i]);
            resultB.push(arrayB[i]);
        }
    }
    return [resultA, resultB];
}

console.log(sumSame(
    [1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4],
    [0.1, 0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.3, 0.3, 0.4, 0.4]
));
.as-console-wrapper { max-height: 100% !important; top: 0; }
1 голос
/ 14 октября 2019

Вы можете создать функцию с методом reduce, которая принимает массив и еще один параметр, который вы можете установить в true или false, и на основе этого вы можете просто фильтровать дубликаты или также суммировать.

const transform = (data, sum = false) => data.reduce((r, e, i) => {
  if (e != data[i - 1]) r.push(e)
  else {
    if (sum) r[r.length - 1] += e
  }
  return r;
}, []);

console.log(transform([1, 1, 1, 1, 2, 2, 2, 3, 3, 4, 4]));
console.log(transform([0.1, 0.1, 0.1, 0.1, 0.2, 0.2, 0.2, 0.3, 0.3, 0.4, 0.4], true));
0 голосов
/ 14 октября 2019

Это может быть чистый раствор

// Find unique
const unique = arrA.reduce((result, curr) => {
 if(result.indexOf(curr)===-1) result.push(curr);
    return result
},[])
console.log(unique)//[1, 2, 3, 4]

//Find sum using reduce
var sum = (a, b) => a+b
var data = arrB.reduce((result, curr) => {
if(!result[curr]) result[curr] = []

result[curr].push(curr);
 return result
},{})
var arrSum = Object.keys(data).map(key => data[key].reduce(sum).toFixed(1))
 console.log(arrSum) //[0.4,0.6,0.6,0.8]
0 голосов
/ 14 октября 2019

если не использовать какие-либо другие объекты, кроме массива, то для первой части вашего вопроса

const arrA = [1,1,1,1,2,2,2,3,3,4,4]
const arrAUnique = arrA
  .sort((a, b) => a - b)
  .filter((v, ind, arr) => v !== arr[ind - 1])

Для решения второго вопроса с использованием только массива используйте

var arrB = [0.1,0.1,0.1,0.1 ,0.2,0.2,0.2 ,0.3,0.3 ,0.4,0.4]
var arrBSum = arrB
   .sort((a, b) => a - b)
   .reduce((newArr, v, ind, arr) => {
      if (v !== arr[ind - 1]) {
         newArr.push(v)
      }  else {
         newArr[newArr.length - 1] += v
      }
      return newArr
   }, [])
0 голосов
/ 14 октября 2019

Для arrA Вы можете использовать Set, как показано ниже

const arr = [1,2,3,4,1,2,3,4.....];
const uniqueArr= Array.from(new Set(arr));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...