Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 按值(Jquery或下划线)压缩对象数组_Javascript_Arrays_Data Structures_Mapreduce_Underscore.js - Fatal编程技术网

Javascript 按值(Jquery或下划线)压缩对象数组

Javascript 按值(Jquery或下划线)压缩对象数组,javascript,arrays,data-structures,mapreduce,underscore.js,Javascript,Arrays,Data Structures,Mapreduce,Underscore.js,我有一个对象数组: "Entries" : [ { "FieldName" : "Name1", "FieldValue" : "N1Value1" }, { "FieldName" : "Name1", "FieldValue" : "N1Value2" }, { "FieldName" : "Name1", "FieldValue" : "N1Value3" }, {

我有一个对象数组:

"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数组中使用z.filter以尝试接收一个数组作为返回,但我得到的只是整个对象

    $.each(arrUniqueFieldNames, function() {
        var strFName = String(this);
        oEntries[this] = _.filter(jsonEntries, function (item) { 
            if (item.FieldName === strFName) {
                return String(item.FieldValue) 
            } 
        });
    });
这段代码中可能有一些缺陷,但它并没有像我预期的那样工作,因为它返回整个对象,而不仅仅是值


我还尝试将.filter替换为.map,但结果是每个数组都有大量未定义的数组。

我知道您希望使用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);

另一个可能更好的可重用/可维护解决方案,也是基于纯语言核心的解决方案,可以使用,然后看起来可能是这样的

变量项=[{ 字段名:Name1, 字段值:N1Value1 }, { 字段名:Name1, 字段值:N1Value2 }, { 字段名:Name1, 字段值:N1Value3 }, { 字段名:Name2, 字段值:N2Value1 }, { 字段名:Name2, 字段值:N2Value2 }, { 字段名:Name2, 字段值:N2Value3 }, { 字段名:Name3, 字段值:N3Value1 }, { 字段名:Name4, 字段值:N4Value1 }, { 字段名:Name5, 字段值:N5Value1 }]; 函数collectAndGroupValuesOfEquallyNamedFieldItems收集器,fieldItem{ 变量 fieldName=fieldItem.fieldName, itemGroup=collector.map[fieldName]; 如果!项目组{ itemGroup=collector.map[fieldName]={ FieldName:FieldName, 字段值:[] }; collector.list.pushitemGroup; } itemGroup.FieldValue.pushfieldItem.FieldValue; 回程收集器; } entries=entries.reducecollectAndGroupValuesOfEquallyNamedFieldItems{ 映射:{}, 名单:[] }.名单; console.log'entries:',entries;
.作为控制台包装{max height:100%!important;top:0;}如果每个数组成员都有一个唯一的FieldName属性,是否有理由希望使用数组而不是键/值存储,如映射或对象?您的结构可以是条目:{Name1:[…values…],Name2:[…values…]}等等。这可以让你更快地按名称查找;否则,我已经得到了我想要的结果:FieldName应该是唯一的,但它不是。我不是在说原始数据。我是说你想做的转变。您可以将其转换为我上面描述的结构,而不是数组。如果您实际上不需要数组,那么这将提供非常快速的按名称查找…而且FWIW,我会使FieldValue保持一致,以便它始终是一个数组,即使其中只有一个值。不幸的是,我在这方面的角色只是按照预期接收的格式修复JSON,我也不知道它是怎么处理的!你不知道你的回答给了我多大的安慰!我以为使用jquery或下划线会更简单!我完全可以使用纯javascript解决方案!如果说有什么区别的话,这更具可读性和直观性。我真的很感激@辣椒粉。。。虽然这种方法乍一看会给人留下好印象,但我并不认为它是精心制作的。它不会像OP所要求的那样,返回按相同名称分组的字段项的新数组。但它将结果数组误用为非数字键值对的普通对象。因此,此数组的长度将始终为零,因此不能用任何数组迭代器方法进行迭代。@Peter Seliger您的反对是正确的,但使用关联数组时这是正常的:它们的长度始终为0。如果您想遍历它,可以使用:for键入result来完成。此方法从IE 9开始可用。@Sascha。。。首先,OP希望将最终结果映射到数组中。这就是我们的要求。第二,如果提供了类似于map/hash的结构,那么出于可读性的原因,应该使用普通对象,而不是类似于数组的列表结构。第三,即使使用对象,也可以通过Object.keys和其他一些数组方法迭代它们的键,而不是依赖笨拙的for-key-in结果。最后,否决你的批评者的干净和有效的解决方案,完全符合OP的规格,是一种糟糕的体育精神。@Peter Seliger。。。我没有投你反对票。我想你先把我的票数降到了0,几分钟后又有人同时把我们两人的票数降到了0。如果没有任何原因意味着某个人有错误,我从不投反对票。我只想指出,当FieldValue只有一个项时,OP提供的结果有一个字符串,而不是一个只有一个成员的数组。但是我觉得OP不太清楚他想要什么。有一个附录考虑了@rockstar的最后一句话,并稍微改变了第一个给定解决方案的实现,以认识到o的双重性质 f字段值数据结构。