У меня есть многомерный массив, и я хочу отфильтровать его по значению определенного индекса. Это выглядит так:

arr = [
       [1 , 101 , 'New post ', 0],
       [2 , 101 , 'New Post' , 1],
       [3 , 102 , 'another post' ,0],
       [4 , 101 , 'New post' ,1],
       [5 , 102 , 'another post' , 1],
       [6 , 103 , 'third post' ,1]
]

Я хочу отфильтровать этот массив на основе postId и получить сумму заголовков с тем же именем. Результат будет выглядеть так:

result_arr = [
       [101 , 'New post', 2],
       [102 , 'another post' ,1],
       [103 , 'third post' ,1]
]
-2
neo-code 28 Авг 2017 в 20:58

3 ответа

Лучший ответ

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

var merged = {};
for (var i = 0; i < arr.length; i++) {
    if (!merged[arr[i][1]]) {
        merged[arr[i][1]] = {likes: arr[i][3], id: arr[i][1], title: arr[i][2]};
    } else {
        merged[arr[i][1]].likes += arr[i][3];
    }
}
var result_arr = [];
for (var post in merged) {
    var p = merged[post];
    result_arr.push([p.id, p.title, p.likes]);
}
1
Kyle Olson 28 Авг 2017 в 18:28

Просто уменьшите массив и используйте объект в качестве карты для каждого сообщения, используя идентификатор сообщения в качестве ключа. Если какой-либо объект найден с использованием ключа на карте, добавьте значение записи, в противном случае добавьте запись для идентификатора записи из входного массива. Вот так:

var array = [
    [1, 101, 'New post ', 0],
    [2, 101, 'New Post', 1],
    [3, 102, 'another post', 0],
    [4, 101, 'New post', 1],
    [5, 102, 'another post', 1],
    [6, 103, 'third post', 1]
];

function mergeArray(array) {
    var o = array.reduce(function(init, each) {
        var ex = init[each[1]];
        if (ex) {
            ex[2] += each[3];
        } else {init[each[1]] = each.slice(1);}
        return init;
    }, {});
    return Object.values(o);
}

console.log('Result: ', mergeArray(array));
0
Koushik Chatterjee 28 Авг 2017 в 19:19

Другой метод, использующий reduce для создания групп, а затем распространения их обратно в массив.

const arr = [
  [1, 101, 'New post ', 0],
  [2, 101, 'New Post', 1],
  [3, 102, 'another post', 0],
  [4, 101, 'New post', 1],
  [5, 102, 'another post', 1],
  [6, 103, 'third post', 1]
];


const groups = arr.reduce((groups, current) => {
  if (groups[current[1]]) {
    groups[current[1]][2] += current[3];
  } else {
    groups[current[1]] = current.slice(1);
  }
  return groups;
}, {});

const result = Object.keys(groups).map((key) => groups[key]);

console.log(result);
0
felixmosh 28 Авг 2017 в 19:09