Javascript 在敲除中设置变量值的最短方法

Javascript 在敲除中设置变量值的最短方法,javascript,knockout.js,observable,Javascript,Knockout.js,Observable,在Knockout中,我有一个可观察变量位置。它的类型为LocationEdit。此viewModel具有可观察字段和非可观察字段 我有一组字段名:字段。对于每个字段,我要重置位置的值 fields.forEach(field => { if (this.uniqueField(locs, field)) { if (ko.isObservable(this.location()[field])) { this.locati

在Knockout中,我有一个可观察变量
位置
。它的类型为
LocationEdit
。此viewModel具有可观察字段和非可观察字段

我有一组字段名:
字段
。对于每个字段,我要重置
位置的值

fields.forEach(field => {
       if (this.uniqueField(locs, field)) {
           if (ko.isObservable(this.location()[field])) {
               this.location()[field](locs[0][field]);
           } else {
               this.location()[field] = locs[0][field];
           }
       }
});

为了使此代码更简单(删除if子句),我是否可以在一行中将值设置为
this.location()[field]

您可以使用条件运算符(
…?…;
),尽管它变化不大:

fields.forEach(field => {
       if (this.uniqueField(locs, field)) {
           ko.isObservable(this.location()[field]) ? this.location()[field](locs[0][field]) : this.location()[field] = locs[0][field];
       }
});
或者您可以编写一个函数:

function upd(arr, index, val) {
    ko.isObservable(arr[index]) ? arr[index](val) : arr[index] = val;
}
用法:

fields.forEach(field => {
       if (this.uniqueField(locs, field)) {
           upd(this.location(), field, locs[0][field]);
       }
});
fields.forEach(field => {
       if (this.uniqueField(locs, field)) {
           ko.updatePotentialObservable(this.location(), field, locs[0][field]);
       }
});
请参见

您甚至可以将此函数添加到
ko

if(typeof ko.updatePotentialObservable == 'undefined')
    ko.updatePotentialObservable = function (arr[index], val) {
        ko.isObservable(obj) ? arr[index](val) : arr[index]= val;
    }
用法:

fields.forEach(field => {
       if (this.uniqueField(locs, field)) {
           upd(this.location(), field, locs[0][field]);
       }
});
fields.forEach(field => {
       if (this.uniqueField(locs, field)) {
           ko.updatePotentialObservable(this.location(), field, locs[0][field]);
       }
});
请参阅其他老实说,我认为的答案肯定是您最好的选择。基本上,您希望创建一个类似于但设置了一个值的实用函数

但既然你说“还想找到另一个解决方案”,这里有一个不同的效用函数。我认为代码中最令人困惑的部分是返回对
locs[0][field]
this.location()[field]
的调用。我想要有这个签名的东西:

reset(source, target, keys);
因此,在代码中,您可以执行以下操作:

reset(
  this.location(), 
  locs[0], 
  fields.filter(f => this.uniqueField(locs, f))
);
现在,在写这个方法的时候,我得出了这样的结论:

const mergePropsObs=(函数(){
//返回用于在对象中设置特定属性的方法
常量getSetter=obj=>prop=>ko.isObservable(obj[prop])
?obj[道具]
:val=>obj[prop]=val;
//返回两个对象的唯一键
//(我选择了一个快速的单列;有很多方法可以做到这一点)
常量所有键=(obj1,obj2)=>
key(Object.assign({},obj1,obj2));
返回值(基本值、外部值、仅返回值)=>{
const props=onlyProps | | allkey(base,ext);
常量值=props.map(p=>ko.unwrap(ext[p]);
道具
.map(getSetter(基))
.forEach((setter,i)=>setter(value[i]);
};
}());
var base={a:1,b:ko.可观测(2),c:5};
哭泣(
基础
{a:2,b:3},
[“a”、“b”];
控制台日志(base.a);
console.log(base.b());
控制台日志(base.c)

是的,当然可以,但我也想再找一个solution@demo否则您可以创建函数,在其他情况下可能会派上用场(请参见答案更新)快速注意:您的
upd
方法无法工作,因为它无法访问原始对象。它需要是
函数upd(obj,key,val){ko.isObservable(obj[key])?obj[key](val):obj[key]=val;}