【问题标题】:KnockoutJS ArrayFirst doesn't work as expectedKnockoutJS ArrayFirst 无法按预期工作
【发布时间】:2019-12-03 12:38:27
【问题描述】:

我已经尝试过这里的解决方案:

但是对我没有任何作用。我正在检查一个项目是否已经存在于可观察数组中

ko.utils.arrayForEach(self.Summary(), function (item) {

            var match = ko.utils.arrayFirst(self.filteredSummary(), function (a) {
                return a.Sku == item.Sku()
            });

            if (!match) {
                // Do push
            }
        });

我做错了吗?即使在调试时,它也总是返回 null。

我附上了值的 sn-p:

【问题讨论】:

  • 运行您的项目,在 arrayFirst 中放置一个调试器,并为我们提供控制台日志:“item”和“a”,并使用片段更新您的帖子
  • 嗨@MKougiouris 更新
  • 为什么 a.Sku 是可观察的? ==item.Sku() - 值 ??可观察与价值 ??这是错的吗?
  • 调试时要小心。您记录的内容与您在下面比较的内容不同,从而为您提供虚假信息。您正在记录 ko.toJSON 的结果,无论传递的属性是否是可观察的,它实际上都会对您隐藏,因为它将返回未包装的值。在您的示例中,如果“a.Sku”是可观察的,您将正确读取 x === y,但这并不意味着 a.Sku === item.Sku()。 “a.Sku”是一个函数,而“item.Sku()”是一个实际的字符串!只是将其留在这里作为将来的帮助说明

标签: javascript knockout.js observable


【解决方案1】:

检查语句,

return item.Sku() === a.Sku()

=== :相等的值和相等的类型, == :等于,

https://www.w3schools.com/js/js_operators.asp

在您的情况下,两个摘要对象的值和类型必须相等。

【讨论】:

    【解决方案2】:

    好的,试试这个

    ko.utils.arrayForEach(self.Summary(), function (item) {
    
                var match = ko.utils.arrayFirst(self.filteredSummary(), function (a) {
                    return a.Sku() == item.Sku();
                });
    
                if (!match) {
                    // Do push
                }
            });
    

    如果这可行,那么问题在于 a.SKu 是一个可观察的并且您没有评估它!阅读我对您原始问题的评论

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-21
      • 2015-06-12
      • 2013-12-23
      • 2014-12-09
      • 2016-01-13
      • 2020-09-21
      • 2011-08-17
      • 2012-04-29
      相关资源
      最近更新 更多