【问题标题】:Given an element and a list, how to functionally select the element after in the list?给定一个元素和一个列表,如何从功能上选择列表中的元素?
【发布时间】:2015-07-18 08:26:52
【问题描述】:

我想了解如何在功能上解决这个问题(map/reduce/etc)

假设我有一个对象列表(我目前正在使用 javascript):

l = [ {id: 43}, {id: 64}, {id: 12} ] 

我想要一个函数 f 给出列表中的下一个元素。

f(l, {id:64}) => {id:12}) 

f(l, {id:12}) => {id:43}

我了解如何强制解决这个问题,但我很难理解如何使用 map/reduce 来解决这个问题。谢谢!

【问题讨论】:

  • 编写一个函数,返回匹配元素的索引,然后将返回的值加 1 并将其用作要检索的元素的索引。

标签: javascript functional-programming


【解决方案1】:

不考虑元素是集合中的最后一项,或者不在集合中:

function findNext(collection, element) {
    var current = collection.indexOf(element);

    return collection[current + 1];
}

我不知道 reduce 或 map 会如何使这变得更好。除非您只想传入一个 id,而不是集合中的对象。然后是:

function findNext(collection, id) {
    var current = collection.map(function (e) { return e.id }).indexOf(id);

    return collection[current + 1];
}

第一个版本,在 jsfiddle 中工作:https://jsfiddle.net/cfxovfge/

【讨论】:

  • 您的函数不适用于示例。它创建一个 new 对象来查找,因此 indexOf 将始终返回 -1。
  • 不,它没有。我添加了一个小提琴来展示。 JavaScript 通过引用传递对象,这不会创建新对象。
  • 您的 jsfiddle 与 @jskulski 示例不同。您正在使用数组元素,但示例使用 f(l, {id:64})
  • 我对这个问题的解释是,那是一行伪代码。如果输入是一个不在集合中的对象,而只是与集合中的某个其他对象具有相同的键和值,那么这个问题就没有意义了。如果这是他们想要做的,我的第二个功能就是要走的路。
  • 您的第二个函数不能完全解决问题:f(l, {id:12})。这是一个不错的选择,但我们不知道这是否可能。
【解决方案2】:

试试下面的代码:

var arr = [ {id: 43}, {id: 64}, {id: 12} ] 

function findNext(arr, el) {
    var index = arr.indexOf(el);
    return index > 0 ? arr[(index + 1) % arr.length] : index;
}

alert(JSON.stringify(findNext(arr, arr[2])));

【讨论】:

    【解决方案3】:
    var f = function(arr, element) {
      for (var i=0, l=arr.length; i<l; i++) {
        if (arr[i].id === element.id) {
          return arr[(i+1)%arr.length];
        }
      }
    };
    

    如果找不到元素,则返回 undefined。

    已编辑:现在它可以工作了,如果您要求最后一个元素的下一个,它会首先返回。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-05-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-31
      • 1970-01-01
      • 2023-01-11
      • 2020-06-22
      相关资源
      最近更新 更多