我有一个多维数组,想要根据特定索引值的值对其进行过滤。它看起来像这样:
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]
]
答案 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
创建组,然后将它们传播回数组。
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;
答案 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));