【问题标题】:Returning a partial array from another array Javascript ES6 syntax从另一个数组 Javascript ES6 语法返回部分数组
【发布时间】:2016-10-16 01:56:56
【问题描述】:

我想使用 ES6 语法从较大的原始数组返回格式化的部分数组:

原始数组

const books = [
    { id: 22, valid: false },
    { id: 7, valid: true },
    { id: 14, valid: false },
    { id: 1, valid: true },
]

新数组

const booksIds = [7, 1] 

要点

const validBooksIds = bookIds.map(book => book.valid ? book.id : null); 

有人吃糖吗?

【问题讨论】:

  • 你的意思是const bookIds = [7, 1]
  • 是的,这是正确的。更新了答案:-)

标签: javascript arrays reactjs ecmascript-6 standards


【解决方案1】:

我会过滤,然后映射:

const books = [
  {id:22, valid:false},
  {id: 7, valid: true}, // keep this
  {id:14, valid:false},
  {id: 1, valid: true}  // keep this
];

const validBookIds = books.filter(b => b.valid).map(b => b.id);

console.log(validBookIds);

【讨论】:

  • 选择这个作为答案仅仅是因为它冗长、易读并且有一个例子。
  • Verbose?也许你的意思是concise。 :-)
【解决方案2】:
const books = [
    { id: 22, valid: false },
    { id: 7, valid: true },
    { id: 14, valid: false },
    { id: 1, valid: true },
]

const validBooksIds = books.filter((it) => it.valid).map((it) => it.id)

【讨论】:

  • 有人可以解释为什么这个答案比公认的答案更好吗?我们都在 20 秒内独立发布了相同的答案,但投票数似乎存在不寻常的差异。
【解决方案3】:

Reduce 可以一口气搞定:

const books = [
    { id: 22, valid: false },
    { id: 7, valid: true },
    { id: 14, valid: false },
    { id: 1, valid: true },
]
  
var bookIds = books.reduce((a,b)=>{if(b.valid) a.push(b.id); return a},[]); 

console.log(bookIds);

可以简化为:

var bookIds = books.reduce((a,b)=>b.valid? a.push(b.id) && a : a,[]);

但这可能会变得有点模糊。

您也可以使用 Array 的 filterMap 方法创建自己的糖并使用它:

Array.prototype.filterMap = function(filterFn, mapFn) {
  return this.filter(filterFn).map(mapFn);
}

console.log(books.filterMap(b=>b.valid,b=>b.id));

可能需要进行一些检查,但您明白了。 ;-)

【讨论】:

  • 是的,对于这种特殊情况,显然最好的方法是减少。基本上我相信以下是reduce方法的最简单的形式。 bookIds = books.reduce((a,b) => b.valid && a.concat(b.id) || a, []);
  • @Redu 是什么让 reduce 成为显而易见的选择?
  • @4castle 三个基本原因,1) reduce 在 O(n) 时间内完成工作 2) 它是完全独立的,不会干扰除了它自己的定义中包含的之外的任何内容。 3)它返回结果,因此您可以将其链接起来以获得适当的功能连续体。这里只有美丽。
  • @Redu 不错!但是filterMap 也拥有所有这些属性。你更喜欢哪个?
  • @4castle 过滤器映射组合是完成这项工作的另一种功能性方式。它还符合自包含并返回结果;但它具有 O(2n) 时间复杂度。这意味着代码必须遍历数组两次,直到它产生结果,而在 reduce 方法中,它可以只通过一次就产生结果。那么它有很大的不同..?我猜不是。
猜你喜欢
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-11
  • 2017-02-12
  • 2019-11-02
相关资源
最近更新 更多