【发布时间】:2018-01-10 14:50:46
【问题描述】:
我有一个对象数组:
"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)
}
});
});
这段代码可能有一些不完美之处,但它并没有像我预期的那样工作,因为它返回整个对象而不仅仅是值。
我还尝试将 _.filter 替换为 _.map,但结果是我为每个数组都得到了一个包含大量“未定义”的数组。
【问题讨论】:
-
如果每个数组成员都有一个唯一的
FieldName属性,是否有理由需要数组而不是键/值存储,例如Map或Object?你的结构可以是Entries: {Name1: [...values...], Name2: [...values...]}等等。这使您可以更快地按名称查找。 -
很遗憾我无法修改原始 JSON 的结构;否则,我已经得到了我想要的 :( FieldName 应该是唯一的,但它不是。
-
我不是在谈论原始数据。我的意思是你想做的转变。您可以将其转换为我上面描述的结构而不是数组。如果您实际上不需要数组,那么这将提供非常快速的名称查找。
-
...FWIW,我会让
FieldValue保持一致,这样它就始终是一个数组,即使其中只有一个值。 -
不幸的是,我在其中的角色只是将 JSON 修复为预期接收的格式,我也无权知道它是如何处理的!
标签: javascript arrays data-structures mapreduce underscore.js