Сравните два массива и подсчитайте инциденты

#javascript #jquery

#javascript #jquery

Вопрос:

У меня есть два массива

 $array1=('18753933','18753933','18771982')
$array2=('18753933','18771982')

  

Я просматриваю каждый из них, чтобы сравнить значения, которые одинаковы в каждом массиве

 var contarArticulosCargados=0;

for(var $i=0;$i<$array1.length;$i  ) {
    for(var $j=0;$j<$array2.length;$j  ) {
        if($array1[$i]===$array[$j]) {
            countArticulosCargados  ;
        }
    }
}

console.log(countArticlesLoaded);
  

Этот пример, который я вставил в свой код, работает хорошо, то есть я выполняю сравнение, и оно работает без проблем.

Что я хочу сделать? (Это то, что я понятия не имею, как сделать)

Как вы можете видеть, in $array1 — это значение 18753933, а in $array2 — это также значение 18753933 .

Я хочу, чтобы при повторении значения это учитывалось, в $array1 значении 18753933 2 время, а значение 18771982 1 время.

Я хочу увидеть что-то вроде этого:

 18753933 repeats: 2 
18771982 is repeated: 1
  

не могли бы вы дать мне представление о том, чего мне не хватает? Мне всегда трудно сравнивать массивы. Спасибо.

Комментарии:

1. ('18753933','18753933','18771982') не является массивом. Он должен быть завернут внутрь []

2. Если вы правы, я пропускаю скобки, но это гипотетический пример, идея в том, что я спрашиваю, как я могу подсчитать повторяющиеся значения и сохранить отдельный счет?

Ответ №1:

Просто сопоставьте array2 и возьмите длину отфильтрованного array1.

 const a1 = ['18753933','18753933','18771982'];
const a2 = ['18753933','18771982'];

const res = a2.map(e => ({[e]: a1.filter(k => k === e).length}));
console.log(res);  

Чтобы удалить элементы, которые не были найдены, вы могли бы сначала выполнить фильтрацию

 a2.filter(e => a1.includes(e)).map(e => ({[e]: a1.filter(k => k === e).length}))
  

или после

 a2.map(e => ({[e]: a1.filter(k => k === e).length})).filter(e => Object.values(e).every(x => x > 0));
  

Или используйте reduce

 const a1 = ['18753933','18753933','18771982'];
const a2 = ['18753933','18771982'];

const res = a2.reduce((a, b) => {
  const l = a1.filter(e => e === b).length;
  if (l) a[b] = l;
  return a;
}, {});

console.log(res);  

Комментарии:

1. Довольно хорошее решение 1. Я думаю, вам следует добавить способ с простыми циклами, поскольку OP кажется начинающим.

Ответ №2:

 const a1 = ['18753933','18753933','18771982'];
const a2 = ['18753933','18771982'];

const r = {};

a2.forEach(_ => r[_] = 0)

a1.forEach(_ => {
    if (r[_] === 0 || r[_]) {
        r[_]  = 1
    }
})

console.log(r)  

Ответ №3:

Похоже, вам нужно будет создать массив объектов. Что-то вроде:

 <!doctype html>
<html>

<head>
  <meta charset="utf-8">
</head>

<body>

  <h2>JavaScript Array of Objects</h2>

  <p id="demo"></p>

  <script>
    var array1 = ['18753933', '18753933', '18771982'];
    var array2 = ['18753933', '18771982'];
    var contarArticulosCargados = [];

    // for each of the numbers in array2
    for (var i = 0; i < array2.length; i  ) {

      // create an object
      contarArticulosCargados.push({
        articulos: array2[i],
        contar: 0
      });

      // for each of the numbers in array2
      for (var j = 0; j < array1.length; j  ) {

        if (array2[i] === array1[j]) {
          // increment counter for the object
          var foo = contarArticulosCargados.length - 1;
          contarArticulosCargados[foo].contar  ;

        }
      }
    }

    // create string for result
    var result = "";
    for (var k = 0; k < contarArticulosCargados.length; k  ) {
      result  = contarArticulosCargados[k].articulos   " repeats: "   contarArticulosCargados[k].contar   ". ";
    }

    // send result to html
    document.getElementById("demo").innerHTML = resu<
    // or console as string
    console.log(result);
    // or console as array
    console.log(contarArticulosCargados);

  </script>
</body>

</html>
  

Вы можете скопировать и вставить HTML-код для тестирования, чтобы увидеть результаты.

Возможно, вы захотите переключить array1 и array2, но я думаю, что у меня есть правильный путь (из вашего примера).

Изменение array1 на что-то другое может помочь визуализации

 var array1 = ['18753933', '18753933', '18771982', '18771982', '18771982', '18771982', '18771982', '18771982', '18771982'];
  

Если array1 был таким, как указано выше, вывод:

 18753933 repeats: 2. 18771982 repeats: 7. 
  

Или, если array1 соответствует первоначально указанному в вопросе, вывод:

 18753933 repeats: 2. 18771982 repeats: 1. 
  

Но, конечно, вопросительные теги JavaScript amp; jQuery но код есть
PHP . Так что я ошибаюсь в любом случае.