按照 ID 数组过滤原始对象数组

6

I have two arrays:

array a:

var a = [
  {
    id: 1,
    name: 'a'
  },
  {
    id: 2,
    name: 'b'
  },
  {
    id: 3,
    name: 'c'
  }
];

数组 ID:

var ids = [1];

我想要通过数组ID筛选并排列数组,期望得到以下结果:
var a = [
  {
    id: 1,
    name: 'a'
  }
];

最重要的是我希望修改原始数组,而不是返回一个新的数组。 underscore 的解决方案更好 :)

顺便说一下:看看这个 META 帖子 http://meta.stackoverflow.com/questions/288160/no-thanks-damn-it - Alexei Levenkov
与论坛网站不同,我们在 [Stack Overflow] 上不使用“谢谢”、“任何帮助都感激”或签名。请参阅“是否应该从帖子中删除‘Hi’、‘thanks’、标语和问候语? - John Saunders
2个回答

8
您可以使用.filter
a = a.filter(function(el){ 
    return ~ids.indexOf(el.id)
});

// should give you [{id: 1, name: 'a'}]

1
我明白了,也许这个答案对你有帮助:https://dev59.com/Smkw5IYBdhLWcg3wdKQv - bruchowski
我提交了一个编辑请求,你只需要用新的数组替换变量a即可。 - Edwin Reynoso
我第一次看到在这样的上下文中使用“~”,您能解释一下它的作用吗? - Fabrice
2
@Fabrice 请点击这里查看解释,但是我在很多年前就回答了这个问题,现在我建议使用Array.includes - bruchowski

4

今天我尝试解决类似的任务(过滤原始对象数组而不创建新的数组),以下是我的解决方案:

const a = [{ id: 1, name: 'a'}, { id: 2, name: 'b'}, { id: 3, name: 'c'}];
const ids = [1];

Array.from(Array(a.length).keys()).reverse().forEach(index =>
  !ids.some(id => id === a[index].id) && a.splice(index, 1)
);

console.log(a); // [{ id: 1, name: 'a'}]

重点是我们需要循环遍历原始数组以便使用Array.prototype.splice,但我不想用for循环,我想要一个ES6的一行代码。而Array.from(Array(a.length).keys()).reverse()给我了一个原始数组的反向索引列表。然后,如果相应项的id不存在于ids数组中,我只想通过当前索引切割原始数组。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接