Javascript-使用map函数而不是嵌套for循环对JSON数组进行非规范化
我正试着了解地图的功能。 以下是使用嵌套for循环的工作代码和输出:Javascript-使用map函数而不是嵌套for循环对JSON数组进行非规范化,javascript,json,dictionary,for-loop,nested,Javascript,Json,Dictionary,For Loop,Nested,我正试着了解地图的功能。 以下是使用嵌套for循环的工作代码和输出: var jsonsToAddTo = [ {'cat':'k1','key2':'a'}, {'cat':'k1','key2':'b'}, {'cat':'k2','key2':'a'}, {'cat':'k2','key2':'b'}, {'cat':'k3','key2':'a'} ] var additionalData = [ {'pk':'k1','key3':'d
var jsonsToAddTo = [
{'cat':'k1','key2':'a'},
{'cat':'k1','key2':'b'},
{'cat':'k2','key2':'a'},
{'cat':'k2','key2':'b'},
{'cat':'k3','key2':'a'}
]
var additionalData = [
{'pk':'k1','key3':'data1'},
{'pk':'k2','key3':'data2'},
{'pk':'k3','key3':'data3'},
]
// Adds a key value pair from sourceJson to targetJson based on a matching value
function denormalizeJsonOnKey(targetJsonArray,targetKeyToMatch, sourceJsonArray, sourceKeyToMatch, keyToAdd){
for(thisJson in targetJsonArray){
for(thatJson in sourceJsonArray){
if(targetJsonArray[thisJson][targetKeyToMatch]==sourceJsonArray[thatJson][sourceKeyToMatch]){
console.log('match');
targetJsonArray[thisJson][keyToAdd]=sourceJsonArray[thatJson][keyToAdd];
}
}
}
return targetJsonArray
}
console.log(denormalizeJsonOnKey(jsonsToAddTo,'cat',additionalData,'pk','key3'))
输出:
[
{ cat: 'k1', key2: 'a', key3: 'data1' },
{ cat: 'k1', key2: 'b', key3: 'data1' },
{ cat: 'k2', key2: 'a', key3: 'data2' },
{ cat: 'k2', key2: 'b', key3: 'data2' },
{ cat: 'k3', key2: 'a', key3: 'data3' }
]
我不知道如何在数组上使用map函数处理嵌套。使用ES6可以简化使用
array\find()
和Object\assign()
var targetJsonArray = jsonsToAddTo.map(function(json, index) {
additionalData.forEach(function(data) {
if (data.pk === json.cat) {
json.key3 = data.key3;
}
})
return json;
})
var数据=[
{'cat':'k1','key2':'a'},
{'cat':'k1','key2':'b'},
{'cat':'k2','key2':'a'},
{'cat':'k2','key2':'b'},
{'cat':'k3','key2':'a'}
]
变量数据2=[
{'pk':'k1','key3':'data1'},
{'pk':'k2','key3':'data2'},
{'pk':'k3','key3':'data3'},
]
const mergeData=(arr1、arr2、matchKey、filterKey、includeKey)=>{
arr1.forEach(o=>{
const newObj={};
const match=arr2.find(e=>e[filterKey]==o[matchKey])
newObj[includeKey]=match?match[includeKey]:空;
赋值对象(o,newObj);
});
}
合并数据(数据、数据2、'cat'、'pk'、'key3')
console.log(数据)
使用ES6可以简化使用数组#查找()
和对象#分配()
var数据=[
{'cat':'k1','key2':'a'},
{'cat':'k1','key2':'b'},
{'cat':'k2','key2':'a'},
{'cat':'k2','key2':'b'},
{'cat':'k3','key2':'a'}
]
变量数据2=[
{'pk':'k1','key3':'data1'},
{'pk':'k2','key3':'data2'},
{'pk':'k3','key3':'data3'},
]
const mergeData=(arr1、arr2、matchKey、filterKey、includeKey)=>{
arr1.forEach(o=>{
const newObj={};
const match=arr2.find(e=>e[filterKey]==o[matchKey])
newObj[includeKey]=match?match[includeKey]:空;
赋值对象(o,newObj);
});
}
合并数据(数据、数据2、'cat'、'pk'、'key3')
console.log(数据)
试试这个,
使用映射
进行两次迭代
var jsonsToAddTo=[{'cat':'k1','key2':'a',{'cat':'k1','key2':'b'},
{'cat':'k2','key2':'a'},{'cat':'k2','key2':'b'},
{'cat':'k3','key2':'a'}]
var additionalData=[{'pk':'k1','key3':'data1'},{'pk':'k2','key3':'data2'},{'pk':'k3','key3':'data3'},
]
函数反规范化Jsononkey(targetJsonArray、targetKeyToMatch、sourceJsonArray、sourceKeyToMatch、keyToAdd){
jsonsToAddTo.map((对象,索引)=>{
additionalData.map((o,idx)=>{
如果(obj[targetKeyToMatch]==o[sourceKeyToMatch]){
obj[keyToAdd]=o[keyToAdd];
}
})
})
返回jsonsToAddTo
}
log(非规范化jsononkey(jsonsToAddTo,'cat',additionalData,'pk','key3'))
试试这个,
使用映射
进行两次迭代
var jsonsToAddTo=[{'cat':'k1','key2':'a',{'cat':'k1','key2':'b'},
{'cat':'k2','key2':'a'},{'cat':'k2','key2':'b'},
{'cat':'k3','key2':'a'}]
var additionalData=[{'pk':'k1','key3':'data1'},{'pk':'k2','key3':'data2'},{'pk':'k3','key3':'data3'},
]
函数反规范化Jsononkey(targetJsonArray、targetKeyToMatch、sourceJsonArray、sourceKeyToMatch、keyToAdd){
jsonsToAddTo.map((对象,索引)=>{
additionalData.map((o,idx)=>{
如果(obj[targetKeyToMatch]==o[sourceKeyToMatch]){
obj[keyToAdd]=o[keyToAdd];
}
})
})
返回jsonsToAddTo
}
log(非规范化Jsononkey(jsonsToAddTo,'cat',additionalData,'pk','key3'))
这是一个解决方案,它利用map
和对象扩展生成一个新数组,将所需的键添加到目标数组的元素中:
var jsonsToAddTo=[
{'cat':'k1','key2':'a'},
{'cat':'k1','key2':'b'},
{'cat':'k2','key2':'a'},
{'cat':'k2','key2':'b'},
{'cat':'k3','key2':'a'}
]
var附加数据=[
{'pk':'k1','key3':'data1'},
{'pk':'k2','key3':'data2'},
{'pk':'k3','key3':'data3'},
]
函数反规范化Jsononkey(targetJsonArray、targetKeyToMatch、sourceJsonArray、sourceKeyToMatch、keyToAdd){
返回targetJsonArray.map(thisJson=>{
const addObj=sourceJsonArray.find(thatJson=>thatJson[sourceKeyToMatch]==thisJson[targetKeyToMatch]);
返回{
…这个JSON,
…addObj?{[keyToAdd]:addObj[keyToAdd]}:{},
}
});
}
console.log(非规范化Jsononkey(jsonsToAddTo,'cat',additionalData,'pk','key3'))
这是一个解决方案,它利用map
和对象扩展生成一个新数组,并将所需的键添加到目标数组的元素中:
var jsonsToAddTo=[
{'cat':'k1','key2':'a'},
{'cat':'k1','key2':'b'},
{'cat':'k2','key2':'a'},
{'cat':'k2','key2':'b'},
{'cat':'k3','key2':'a'}
]
var附加数据=[
{'pk':'k1','key3':'data1'},
{'pk':'k2','key3':'data2'},
{'pk':'k3','key3':'data3'},
]
函数反规范化Jsononkey(targetJsonArray、targetKeyToMatch、sourceJsonArray、sourceKeyToMatch、keyToAdd){
返回targetJsonArray.map(thisJson=>{
const addObj=sourceJsonArray.find(thatJson=>thatJson[sourceKeyToMatch]==thisJson[targetKeyToMatch]);
返回{
…这个JSON,
…addObj?{[keyToAdd]:addObj[keyToAdd]}:{},
}
});
}
log(非规范化Jsononkey(jsonsToAddTo,'cat',additionalData,'pk','key3'))
而不是在这里嵌套循环,它将为jsonsToAddTo
中的每个条目迭代整个additionalData
数组,我建议在开始时为additionalData
dataset构建一个对象映射,然后在目标数据集的.map中引用该映射:
var jsonsToAddTo = [
{'cat':'k1','key2':'a'},
{'cat':'k1','key2':'b'},
{'cat':'k2','key2':'a'},
{'cat':'k2','key2':'b'},
{'cat':'k3','key2':'a'}
]
var additionalData = [
{'pk':'k1','key3':'data1'},
{'pk':'k2','key3':'data2'},
{'pk':'k3','key3':'data3'},
]
// Adds a key value pair from sourceJson to targetJson based on a matching value
function denormalizeJsonOnKey(targetJsonArray,targetKeyToMatch, sourceJsonArray, sourceKeyToMatch, keyToAdd){
// Build an object of items keyed on sourceKeyToMatch
const sourceJsonMap = sourceJsonArray.reduce((obj, item) => (obj[item[sourceKeyToMatch]]=item, obj), {});
return targetJsonArray.map(item => {
const targetValue = item[targetKeyToMatch];
if (sourceJsonMap.hasOwnProperty(targetValue)) {
item[keyToAdd] = sourceJsonMap[targetValue][keyToAdd];
}
return item;
});
}
console.log(denormalizeJsonOnKey(jsonsToAddTo,'cat',additionalData,'pk','key3'))
这样做应该效率更高,尤其是当您正在处理的数据集相当大时。而不是在此处嵌套循环,它将对
jsonsToAddTo
中的每个条目迭代整个附加数据数组,我建议在开始时为附加数据数据集构建一个对象映射,然后