JavaScript:来自数组

时间:2017-08-28 17:58:42

标签: javascript angularjs arrays node.js

我有一个多维数组,想要根据特定索引值的值对其进行过滤。它看起来像这样:

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]
]

3 个答案:

答案 0 :(得分:1)

这是一种非常强力的方法,但它确实有效。顺便说一句,我会按ID而不是标题合并您的项目,因为在您的示例中,您的标题内容不匹配。

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 :(得分:0)

另一种方法,使用reduce创建组,然后将它们传播回数组。

&#13;
&#13;
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);
&#13;
&#13;
&#13;

答案 2 :(得分:0)

只需缩小数组,并使用对象作为每个帖子的地图,使用post id作为键。如果使用地图中的键找到任何对象,请添加post值,否则从输入数组中添加post id的条目。我们走了:

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));