2

实际上,这个问题与 typeahead bootstrap 有关,因为我需要使用自动完成定义一个值数组以在输入文本中显示。

无论如何,目标只是定义一个读取对象数组并返回字符串数组的函数。这是我的代码(1)。

(1) 的目标是:1) 从对象数组中获取字符串数组。2)过滤这个数组拒绝一些元素。

它不起作用,因为我要拒绝的元素仍然存在于数组中。事实上,在自动完成中我得到了 false 值,实际上它破坏了代码,因为预先输入不期望 false 。

应该如何修复代码并改进它?


(1)

element.typeahead({
    source: function ( {
        var users = _.map(app.userCollection.models, function (model) {
            if (model.get('id') === app.currentUser.id) {
                return false;
            }
            return model.get('first_name') + ' ' + model.get('last_name');
        });
        console.log(users); // [false, 'some name'];
        _.reject(users, function(name) {
            return name  === false;
        });
        console.log(users); // [false, 'some name'];
                            // why does the false value persist?
        return users;
    }
});
4

1 回答 1

4

下划线方法通常不对数组本身进行操作,但它们会返回一个新数组,但我建议单独检查每个函数的下划线文档以进行确认。在这种情况下,我们可以安全地假设拒绝返回一些新数组,根据下划线文档中的这句话:

返回列表中的值,不包含真值测试(迭代器)通过的元素。

您目前正在做的是:

_.reject(users, function(name) {
  return name  === false;
});

因此,您实际上并没有将结果保存在任何地方。要保留对数组的引用而不包含不需要的元素,请执行以下操作:

users = _.reject(users, function(name) {
  return name  === false;
});

这会产生你想要的结果,但让我给你一个重构提示:

尽可能使用主干自己的方法,这将使代码更具可读性

source: function() {
  // filter the collection down to the users you want
  var users = app.userCollection.filter(function(model) {
    return model.id === app.currentUser.id;
  });
  // -> users is now an array of models

  // use map to transform each wanted user to a string giving its full name
  users = _.map(users, function(user) {
    return user.get('first_name')+' '+user.get('last_name');
  });
  // -> users is now an array of strings

  return users;
}

希望这可以帮助!

于 2012-08-24T14:27:04.780 回答