Как concat () несколько массивов и проверить, существуют ли уже значения - PullRequest
0 голосов
/ 22 апреля 2019

Я объединяю несколько массивов в один массив.Это хорошо работает

this.facetsLocations = [].concat(
                response.facets['134_locations'].terms,
                response.facets['135_locations'].terms
              );

Но вывод не то, что я хочу.Как вы видите, у меня такие же термины, как «deutschland», count: 6 «deutschland», count: 4 и т. Д.

результат должен быть один «deutschland», count 10, я хочу проверить, еслизначение уже существует и добавьте значения счетчика.

(11) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}]
0: {term: "deutschland", count: 6}
1: {term: "basel", count: 3}
2: {term: "osteuropa", count: 2}
3: {term: "österreich", count: 1}
4: {term: "ungarn", count: 1}
5: {term: "schweiz", count: 1}
6: {term: "basel", count: 5}
7: {term: "deutschland", count: 4}
8: {term: "österreich", count: 1}
9: {term: "ungarn", count: 1}

Ответы [ 4 ]

3 голосов
/ 22 апреля 2019

Функция concat() объединяет только два массива, т.е. возвращает новый массив, который содержит все элементы из первого и второго (и более) массивов.Он больше ничего не делает и не занимается содержимым сливающихся массивов, это должно быть логикой вашего приложения.

Один из способов добиться того, что вам нужно, - использовать reduce() вместо concat()вот так:

// This is pretty much the same as doing concatenation your way
const terms = [
  ...response.facets['134_locations'].terms,
  ...response.facets['135_locations'].terms,
];

// using reducer on all terms
this.facetsLocations = Object.values(terms.reduce((acc, item) => {
  if (typeof acc[item.term] === 'undefined') {
    // set default value for each term as 0
    acc[item.term] = item;
  } else {
    // add to total count of each term
    acc[item.term].count += item.count;

    // potentially add logic to handle changing "selected" too...
  }

  return acc;
}, {}));
1 голос
/ 22 апреля 2019

Вы можете создать метод concatObject вот так

var objA = {term: "deutschland", count: 6}
var objB = {term: "deutschland", count: 4}
function concatObject(objA, objB){
obj = Object.keys(objA).concat(Object.keys(objB))
  .reduce(function(obj, k) {
  
    obj[k] = (objA[k] || 0) + (objB[k] || 0);
  
    return obj;
  
  }, {})
//  console.log(obj);
return obj;
 }
 
 var res = concatObject(objA, objB);
 console.log(res);
0 голосов
/ 22 апреля 2019

используйте lodash

  var data = [
{ term: "deutschland", count: 6 },
{ term: "basel", count: 3 },
{ term: "osteuropa", count: 2 },
{ term: "österreich", count: 1 },
{ term: "ungarn", count: 1 },
{ term: "schweiz", count: 1 },
{ term: "basel", count: 5 },
{ term: "deutschland", count: 4 },
{ term: "österreich", count: 1 },
{ term: "ungarn", count: 1 }


]

  let groupped = (_.groupBy(this.data, "term"));

    let view = Object.keys(groupped).map((k) => {
      return {
        term: k,
        count: groupped[k].length
      }
    })

    console.log(view);
0 голосов
/ 22 апреля 2019

Вы можете использовать array#filter, чтобы найти весь объект с вашим значением term, а затем с помощью array#reduce подвести итог

let data = [{term: "deutschland", count: 6},{term: "basel", count: 3},{term: "osteuropa", count: 2},{term: "österreich", count: 1},{term: "ungarn", count: 1},{term: "schweiz", count: 1},{term: "basel", count: 5},{term: "deutschland", count: 4},{term: "österreich", count: 1},{term: "ungarn", count: 1}],
    term = "deutschland",
    result = {term, count : data.filter(o => o.term === term)
                                .reduce((sum, {count}) => sum += count, 0)};
console.log(result);

Вы можете просто использовать array#reduce для суммирования всех подсчетов за один term.

let data = [{term: "deutschland", count: 6},{term: "basel", count: 3},{term: "osteuropa", count: 2},{term: "österreich", count: 1},{term: "ungarn", count: 1},{term: "schweiz", count: 1},{term: "basel", count: 5},{term: "deutschland", count: 4},{term: "österreich", count: 1},{term: "ungarn", count: 1}],
    term = "deutschland",
    result = data.reduce((r, o) => {
      if(term === o.term) {
        r.count += o.count;
      }
      return r;
    },{term, count : 0});
console.log(result);
...