【问题标题】:Filter the original array of objects by array of ids按 id 数组过滤原始对象数组
【发布时间】:2015-07-20 01:07:48
【问题描述】:

我有两个数组:

数组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'
  }
];

最重要的是我想要改变原始数组,而不是返回一个新数组。

下划线解决方案更好:)

【问题讨论】:

标签: javascript arrays underscore.js


【解决方案1】:

您可以使用.filter

a = a.filter(function(el){ 
    return ~ids.indexOf(el.id)
});

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

【讨论】:

  • 我明白了,也许这个答案可能对你有帮助:stackoverflow.com/questions/9882284/…
  • 我做了一个编辑请求,你所要做的就是用新数组替换变量 a
  • 我第一次看到在这样的上下文中使用“~”,你能解释一下它的作用吗?
  • @Fabrice 请参阅here 以获得解释,但我多年前回答了这个问题,现在我建议使用Array.includes
【解决方案2】:

今天我尝试解决类似的任务(过滤原始对象数组而不创建新数组),这就是我想出的:

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 数组中时,才按当前索引拼接原始数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-27
    • 1970-01-01
    • 2018-11-12
    • 2022-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多