【问题标题】:Convert or Map Knockout array to an object将 Knockout 数组转换或映射到对象
【发布时间】:2013-12-01 15:31:13
【问题描述】:

我有一个 Knockout 可观察数组,其内部结构如下所示,

property: "Email"
value: "name@email.com"

我需要将它转换成这样的淘汰模型对象,

var obj;
obj.Email ="name@email.com";

在 Knockout 中是否有一种简单的方法来实现这一点?

提前致谢

【问题讨论】:

  • 恐怕不是
  • 是的,你问的不是一个独特的问题,也许你还没有意识到这一点,因为你问错了问题。
  • 能否请您发布其余代码以及到目前为止您做了什么?

标签: knockout.js


【解决方案1】:

您可以创建一个可重用的模型以在您的视图模型中使用。这类似于在 C# 中使用类来创建具有公共属性的对象。

function objectModel(item) {
    var self = this;
    self.Name = ko.observable(item.name);
    self.Description = ko.observable(item.description);
}

可以像这样调用 -

var object = {
    name: 'John',
    description: 'a person'
}

var john = new objectModel(object);

这也可以通过参数来完成,而不仅仅是对象 -

function objectModel(name, description) {
    var self = this;
    self.Name = ko.observable(name);
    self.Description = ko.observable(description);
}

var john = new objectModel('John', 'a person');

【讨论】:

  • 嗨,PW Kad,您是否抽空查看我对上述 beauXjames 解决方案的评论?有什么想法吗?
  • 我不明白这个问题 - 你看过映射实用程序吗?
【解决方案2】:

当然,将一个对象映射到另一个对象的最佳方法是通过 knockout 的实用函数 arrayMap...例如,如果您有数组对象...

var thisArray = [ 
    { property: 'Email', value: 'name@email.com'}, 
    { property: '', value: ''}... 
];

而且你有一些其他的对象类型要映射到...

var newObject = function(email) { 
    var self = this;
    self.Email = email;
};

就这么简单……

ko.utils.arrayMap(thisArray, function(arrayItem) { 
    if(arrayItem.property === 'Email')
        return new newObject(arrayItem.value);
});

返回一个新的 newObject 数组。

【讨论】:

  • whatif newObject 的签名包含多个参数,而不是在您的情况下是电子邮件,我虽然同意 PW Kad 的解决方案,但我仍然必须单独找到哪个属性是名称或电子邮件,然后构造对象....
  • 好吧,取决于。您可以将这些多个参数放入您的“arrayItem”中吗?如果没有,那么您需要将它们放在某个地方,对吗?您始终可以使用 ko.mapping 插件编写自定义映射例程......还有更多关于 SO 的主题。
猜你喜欢
  • 2019-05-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 1970-01-01
相关资源
最近更新 更多