Knockout.js 在具有空字符串的数组上使用fromJS将用false替换这些字符串

Knockout.js 在具有空字符串的数组上使用fromJS将用false替换这些字符串,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,映射下面的对象时,数组中的空“值在可观察数组中映射为false: var d2 = { "values": [{"9", false, "", true, null, "", "", ""] }; var viewmodel2 = ko.mapping.fromJS(d2); 当使用ko.mapping.toJSON(viewmodel2)映射回json时这是结果: { "values": [ "9", false, false, true,

映射下面的对象时,数组中的空
值在可观察数组中映射为false:

var d2 = {
    "values": [{"9", false, "", true, null, "", "", ""]
};

var viewmodel2 = ko.mapping.fromJS(d2);
当使用
ko.mapping.toJSON(viewmodel2)映射回json时这是结果:

{ "values": [
    "9",
    false,
    false,
    true,
    null,
    false,
    false,
    false] }
请注意,数组中的最后3个字符串值被转换回false

这是虫子吗?或者不支持包含布尔值和字符串的数组


这里有一个解决方法。

这似乎是一个明确的错误

我对您的JSFIDLE代码进行了分叉,发现问题似乎在于当toJSON方法开始解析对象时,它会取第一个(“”或false),并将每个(“”或false)视为找到的初始对象

如果这没有多大意义,请尝试将对象开头的false改为“”,反之亦然

您可能想在Steve Sanderson的github页面上发布有关此问题的信息

这确实是一个bug,现已修复。 这是由两件事引起的:

  • 用于查看数组中包含哪些键的相等比较使用了“==”运算符而不是“==”,因此它认为“false”和“”是同一个键
  • 其次,作为复制密钥处理逻辑的一部分,我对数组中的所有密钥进行排序。但是,如果不显式提供键回调,则不应执行此操作,因为在这种情况下,您可能关心项的顺序

GitHub提供了最新版本1.2.3,还创建了一个NuGet包。由Srluisreyes精心制作的复制品现在也可以使用了

谢谢,我注意到你报告了这个问题。我的临时解决方法是使用布尔作为字符串“True”、“False”,很快就变脏了。我用最新版本的knockout映射更新了fiddle。谢谢你的快速修复,罗伊。