javascript - 按值排列的对象紧凑数组(Jquery 或 Underscore)

标签 javascript arrays data-structures mapreduce underscore.js

我有一个对象数组:

"Entries" : [ {
        "FieldName" : "Name1",
        "FieldValue" : "N1Value1"
    }, {
        "FieldName" : "Name1",
        "FieldValue" : "N1Value2"
    }, {
        "FieldName" : "Name1",
        "FieldValue" : "N1Value3"
    }, {
        "FieldName" : "Name2",
        "FieldValue" : "N2Value1"
    }, {
        "FieldName" : "Name2",
        "FieldValue" : "N2Value2"
    }, {
        "FieldName" : "Name2",
        "FieldValue" : "N2Value3"
    }, {
        "FieldName" : "Name3",
        "FieldValue" : "N3Value1"
    }, {
        "FieldName" : "Name4",
        "FieldValue" : "N4Value1"
    }, {
        "FieldName" : "Name5",
        "FieldValue" : "N5Value1"
    } ]

我想把它改成:

"Entries" : [ {
          "FieldName" : "Name1",
          "FieldValue" : ["N1Value1","N1Value2","N1Value3"] 
      }, {
          "FieldName" : "Name2",
          "FieldValue" : ["N2Value1", "N2Value2", "N2Value3"]
      }, {
          "FieldName" : "Name3",
          "FieldValue" : "N3Value1"
      }, {
          "FieldName" : "Name4",
          "FieldValue" : "N4Value1"
      }, {
          "FieldName" : "Name5",
          "FieldValue" : "N5Value1"
      } ]

我尝试首先在数组中拥有唯一的 FieldName 值,然后在 JSON 数组中使用 _.filter 来尝试接收数组作为返回,但我得到的只是整个对象。

    $.each(arrUniqueFieldNames, function() {
        var strFName = String(this);
        oEntries[this] = _.filter(jsonEntries, function (item) { 
            if (item.FieldName === strFName) {
                return String(item.FieldValue) 
            } 
        });
    });

这段代码中可能有一些缺陷,但它并没有像我预期的那样工作,因为它返回整个对象而不仅仅是值。

我还尝试用 _.map 替换 _.filter,但结果是我得到的每个数组都有很多“未定义”。

最佳答案

我知道你想用 jquery 来实现,但我对此不太坚定,所以我给你一个纯 JavaScript 的解决方案:

test =  [ {
    "FieldName" : "Name1",
    "FieldValue" : "N1Value1"
    }, {
    "FieldName" : "Name1",
    "FieldValue" : "N1Value2"
    }, {
    "FieldName" : "Name1",
    "FieldValue" : "N1Value3"
    }, {
    "FieldName" : "Name2",
    "FieldValue" : "N2Value1"
    }, {
    "FieldName" : "Name2",
    "FieldValue" : "N2Value2"
    }, {
    "FieldName" : "Name2",
    "FieldValue" : "N2Value3"
    }, {
    "FieldName" : "Name3",
    "FieldValue" : "N3Value1"
    }, {
    "FieldName" : "Name4",
    "FieldValue" : "N4Value1"
    }, {
    "FieldName" : "Name5",
    "FieldValue" : "N5Value1"
    } ];

result =[];

for (i=0; i<test.length; i++)
{
    element=test[i];
    key=element['FieldName'];
    value=element['FieldValue'];
    if (!(key in result))
        result[key] = [value];
    else
        result[key].push(value);
}
console.log(result);

关于javascript - 按值排列的对象紧凑数组(Jquery 或 Underscore),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48190019/

相关文章:

c - 为什么我的最小值显示一些垃圾值?

c++ - 在 c 中复制数组与复制 int 成本和性能

javascript - 谷歌地图自定义标记图像不起作用

javascript - 如何让多个 View 在 Knockout.js 的 View 模型中工作

javascript - 找到一个返回值作为变量

javascript - Angular 2+ HTTP POST 和 GDrive API。带名称的断点续传文件上传

objective-c - 快速排序按业务键排序数组?

javascript - 寻址 JSON 数组中的对象

c++ - 如何将 8 个字节写入 void * 地址?

c++ - 成对交换节点而不交换 LinkedList 中的数据