如何映射对象数组的名称以更改字段名称

How can I map the names of an array of objects to change the field names?

本文关键字:改字段名 数组 对象 何映射 映射      更新时间:2023-09-26

我正在将数据从我的客户端发送到我的 WebApi 控制器上接受 ResponseFromClient 类的方法。由于它是WebApi,因此可以处理来自JSON的所有转换,并更改任何字段名称以匹配javascript和C#之间的大小写约定差异:

public class ResponseFromClient
{
    public int QuestionId { get; set; }
    public ICollection<AnswerDetail> Answers { get; set; }
    public string Task { get; set; }
}
public class AnswerDetail
{
    public int AnswerId { get; set; }
    public string Text { get; set; }
    public bool? Correct { get; set; }
    public bool? Response { get; set; }
}

在Javascript中,我有一个名为ans的数组,每个元素看起来像这样:

qs.ans[index].id = element.answerId;
qs.ans[index].c = null;
qs.ans[index].r = false;
qs.ans[index].text = element.text;  

我需要将 Javascript 对象responseFromClient的内容发送到 C# 服务器程序:

        var responseFromClient = {
            questionId: qs.q,
            answers: qs.ans,
            task: task
        };
        $http({
            method: 'POST',
            url: url,
            data: responseFromClient
        })

有没有一种简单的方法可以在 javascript 变量responseFromClient中设置 answers 字段,以便它接收一个包含映射到 AnswerDetail 类的对象的数组。换句话说,我需要更改它,以便获得答案和如下所示的对象数组:

old > new
id > AnswerID
c  > Correct
t  > Text
r  > Response

我想像我重新映射qs.q>questionId一样这样做。但是ans是一个数组,所以我不确定如何做到这一点。

JavaScript 中将对象映射到类上不是更容易

吗?
qs.ans[index].answerId = element.answerId;
qs.ans[index].correct = null;
qs.ans[index].response = false;
qs.ans[index].text

在 AJAX 调用中

data: { "answerswerId" : responseFromClient.id, 
        "correct": responseFromClient.c, 
        "response": responseFromClient.t, 
        "text": responseFromClient.text }

您可以简单地使用旧的 => 新键数组重新映射所需的值。有更高级的方法可以做到这一点,但我不知道你案件的所有细节......

function remap(obj, old_keys, new_keys){
    var len = old_keys.length;
    var new_obj = {};
    for (var i = 0; i < len; i++) {
        new_obj[new_keys[i]] = obj[old_keys[i]];
    }
    return new_obj;
}
var len = ans.length;
var old_keys = ["id", "c", "r", "text"];
var new_keys = ["AnswerId", "Correct", "Response", "Text"]
for (var i = 0; i < len; i++) {
    ans[i] = remap(ans[i], old_keys, new_keys);
}