比较 javascript FormData 对象

问题描述 投票:0回答:3

如何比较 FormData 对象,我试图在发送 ajax 请求之前检查表单是否已更改。

但物体似乎无法比较。有什么方法可以将其转换为js对象或者优雅的方式吗?

let a = new FormData()
let b = new FormData()

console.log(a === b ) // returns false
javascript form-data
3个回答
7
投票

我会尝试这个

const a = new FormData();

a.append("username", "Alexander");
a.append("accountnum", 123);

const b = new FormData();

b.append("username", "Alexander");
b.append("accountnum", 123);

let different = false
for (let [key, value] of b.entries()) {
  if (a.get(key) !== value) different = true
}

或者您可以尝试迭代两个对象并比较它们,这可能会提高性能。

JSON.stringify([...a.entries()]) === JSON.stringify([...b.entries()])

2
投票

您可以使用

formData.entries()

let a = new FormData()
let b = new FormData()

let arr1 = [];
let arr2 = [];

for(let pair of a.entries()) {
    const key = pair[0];
    arr1.push({[key]: pair[1]})
}

for(let pair of b.entries()) {
    const key = pair[0];
    arr2.push({[key]: pair[1]})
}

然后您可以比较两个对象数组。


0
投票

我最终陷入了这个令人厌恶的境地。

export default function formDataEqual(one, two) {
    var arrOne = [];
    var arrTwo = [];

    for (let entry of one.entries()) {
        arrOne.push(entry[0], entry[1]);
    }

    for (let entry of two.entries()) {
        arrTwo.push(entry[0], entry[1])
    }

    if (arrOne.length !== arrTwo.length) {
        return false;
    }

    var entry;

    while (entry = arrOne.pop()) {
        if (entry !== arrTwo.pop()) {
            return false;
        }
    }


    return true;
}

它使用 Daniyal 溶液,稍作修改。它似乎可以正确处理同一密钥的倍数。但是,我认为如果字段的顺序发生变化,可能会导致一些问题。

© www.soinside.com 2019 - 2024. All rights reserved.