Javascript 尝试检查对象是否存在于敲除可观察数组中

Javascript 尝试检查对象是否存在于敲除可观察数组中,javascript,typescript,knockout.js,Javascript,Typescript,Knockout.js,我试图检查一个对象是否与在可观察数组中具有相同可观察属性的其他对象具有相同的可观察值 我创建了一个foreach循环,用于评估是否有任何观测值匹配。我遇到的问题是,条件的计算结果总是为true,即使这些值不同。我正在使用打字脚本和敲除 代码如下: export function addPDFToPackage(heat: MTRHeat): void { var koHeat: MTRHeatWithInclude = ko.mapping.fromJS(heat); koH

我试图检查一个对象是否与在可观察数组中具有相同可观察属性的其他对象具有相同的可观察值

我创建了一个foreach循环,用于评估是否有任何观测值匹配。我遇到的问题是,条件的计算结果总是为true,即使这些值不同。我正在使用打字脚本和敲除

代码如下:

 export function addPDFToPackage(heat: MTRHeat): void {

    var koHeat: MTRHeatWithInclude = ko.mapping.fromJS(heat);
    koHeat.Include = ko.observable(true);

    var arrayOfHeats = model.mtrPackage.Heats();
    var addToHeats = () => model.mtrPackage.Heats.push(koHeat);

    var duplicate = false;

    arrayOfHeats.forEach(function (koHeat, i) {
        if (arrayOfHeats[i].MTRID() == koHeat.MTRID() && arrayOfHeats[i].HeatID() == koHeat.HeatID() && arrayOfHeats[i].PartID() == koHeat.PartID()) {
            duplicate = true;
        }
        else
            duplicate = false;
    })

    if (!!model.mtrPackage.PackageID()) {
        if (duplicate) {
            var c = confirm("Warning: Duplicate MTR located on current package.Proceed ?")
            if (c) {
                ServiceMethods.addHeatToPackage(model.mtrPackage.PackageID(), heat.HeatID).done(addToHeats);
            }
            if (!c) {
                return;
            }
        }
    }
}

我认为您在这里定义的
koHeat
之间遇到了冲突:

var koHeat: MTRHeatWithInclude = ko.mapping.fromJS(heat);
koHeat.Include = ko.observable(true);
以及
forEach
调用中定义的变量。它总是返回true作为(在
forEach
的范围内)
arrayofheat[i]==koHeat
的值

试试这个:

 export function addPDFToPackage(heat: MTRHeat): void {

    var koHeat: MTRHeatWithInclude = ko.mapping.fromJS(heat);
    koHeat.Include = ko.observable(true);

    var arrayOfHeats = model.mtrPackage.Heats();
    var addToHeats = () => model.mtrPackage.Heats.push(koHeat);

    var duplicate = false;

    arrayOfHeats.forEach(function (koHeat2, i) {
        if (koHeat2.MTRID() == koHeat.MTRID() && 
            koHeat2.HeatID() == koHeat.HeatID() && 
            koHeat2.PartID() == koHeat.PartID()) {
            duplicate = true;
        }
    })

    if (!!model.mtrPackage.PackageID()) {
        if (duplicate) {
            var c = confirm("Warning: Duplicate MTR located on current package.Proceed ?")
            if (c) {
                ServiceMethods.addHeatToPackage(model.mtrPackage.PackageID(), heat.HeatID).done(addToHeats);
            } else {
                return;
            }
        }
    }
}

我认为您在这里定义的
koHeat
之间遇到了冲突:

var koHeat: MTRHeatWithInclude = ko.mapping.fromJS(heat);
koHeat.Include = ko.observable(true);
以及
forEach
调用中定义的变量。它总是返回true作为(在
forEach
的范围内)
arrayofheat[i]==koHeat
的值

试试这个:

 export function addPDFToPackage(heat: MTRHeat): void {

    var koHeat: MTRHeatWithInclude = ko.mapping.fromJS(heat);
    koHeat.Include = ko.observable(true);

    var arrayOfHeats = model.mtrPackage.Heats();
    var addToHeats = () => model.mtrPackage.Heats.push(koHeat);

    var duplicate = false;

    arrayOfHeats.forEach(function (koHeat2, i) {
        if (koHeat2.MTRID() == koHeat.MTRID() && 
            koHeat2.HeatID() == koHeat.HeatID() && 
            koHeat2.PartID() == koHeat.PartID()) {
            duplicate = true;
        }
    })

    if (!!model.mtrPackage.PackageID()) {
        if (duplicate) {
            var c = confirm("Warning: Duplicate MTR located on current package.Proceed ?")
            if (c) {
                ServiceMethods.addHeatToPackage(model.mtrPackage.PackageID(), heat.HeatID).done(addToHeats);
            } else {
                return;
            }
        }
    }
}

第一个问题:循环将每个对象与自身进行比较,因为重复使用变量名
koHeat
。我相信你真的想提到“外部”
koHeat

第二个问题:在每次循环迭代中覆盖
replicate
变量。这可能不是你想要的。相反,您希望在找到重复项后立即停止循环

沿着这些路线走怎么样

export function addPDFToPackage(heat: MTRHeat): void {
    var koHeat: MTRHeatWithInclude = ko.mapping.fromJS(heat);
    var packageId = model.mtrPackage.PackageID();

    koHeat.Include = ko.observable(true);

    function equals(a: MTRHeatWithInclude, b: MTRHeatWithInclude): boolean {
        return a.MTRID() == b.MTRID() && a.HeatID() == b.HeatID() && a.PartID() == b.PartID();
    }

    if ( !!packageId && (
        !model.mtrPackage.Heats().some(item => equals(item, koHeat)) ||
        confirm("Warning: Duplicate MTR located on current package.Proceed ?")
        )
    ) {
        ServiceMethods.addHeatToPackage(packageId, heat.HeatID).done(() => {
            model.mtrPackage.Heats.push(koHeat);
        });
    }
}

equals()
函数在理想情况下应该是
MTRHeatWithInclude
类的方法。

第一个问题:循环将每个对象与自身进行比较,因为重复使用变量名
koHeat
。我相信你真的想提到“外部”
koHeat

第二个问题:在每次循环迭代中覆盖
replicate
变量。这可能不是你想要的。相反,您希望在找到重复项后立即停止循环

沿着这些路线走怎么样

export function addPDFToPackage(heat: MTRHeat): void {
    var koHeat: MTRHeatWithInclude = ko.mapping.fromJS(heat);
    var packageId = model.mtrPackage.PackageID();

    koHeat.Include = ko.observable(true);

    function equals(a: MTRHeatWithInclude, b: MTRHeatWithInclude): boolean {
        return a.MTRID() == b.MTRID() && a.HeatID() == b.HeatID() && a.PartID() == b.PartID();
    }

    if ( !!packageId && (
        !model.mtrPackage.Heats().some(item => equals(item, koHeat)) ||
        confirm("Warning: Duplicate MTR located on current package.Proceed ?")
        )
    ) {
        ServiceMethods.addHeatToPackage(packageId, heat.HeatID).done(() => {
            model.mtrPackage.Heats.push(koHeat);
        });
    }
}

equals()
函数在理想情况下应该是
MTRHeatWithInclude
类的一个方法。

您在数组末尾推了koHeat,我认为这就是返回true的原因(不是所有元素)。您在数组末尾推了koHeat,我认为这就是返回true的原因(不是所有元素)。