Javascript 映射数组元素和返回对象

Javascript 映射数组元素和返回对象,javascript,Javascript,我有这样一个对象数组: var pools = [{ dce: 3, lts: 2, name: "nift nation", }, { dce: 1049.99, lts: 104.999, name: "NSG I.NS. Mark Select", }, { dce: 162, lts: 36.157, name: "Shift-Team Mark Select", } ] 我得到: [ {

我有这样一个对象数组:

var pools = [{
    dce: 3,
    lts: 2,
    name: "nift nation",
  },
  {
    dce: 1049.99,
    lts: 104.999,
    name: "NSG I.NS. Mark Select",
  },
  {
    dce: 162,
    lts: 36.157,
    name: "Shift-Team Mark Select",
  }
]
我得到:

[
  {
    "nift_nation": [
      {
        "nift_nationDollars": ""
      },
      {
        "nift_nationUnits": ""
      },
      {
        "nift_nationPercentage": ""
      }
    ]
  },
  {
    "NSG_I$NS$_Mark_Select": [
      {
        "NSG_I$NS$_Mark_SelectDollars": ""
      },
      {
        "NSG_I$NS$_Mark_SelectUnits": ""
      },
      {
        "NSG_I$NS$_Mark_SelectPercentage": ""
      }
    ]
  },
  {
    "Shift__Team_Mark_Select": [
      {
        "Shift__Team_Mark_SelectDollars": ""
      },
      {
        "Shift__Team_Mark_SelectUnits": ""
      },
      {
        "Shift__Team_Mark_SelectPercentage": ""
      }
    ]
  }
]
var池=[{
dce:3,
lts:2,
名称:“nift国家”,
},
{
dce:1049.99,
lts:104.999,
名称:“NSG识别号标记选择”,
},
{
dce:162,
lts:36.157,
名称:“班组标记选择”,
}
]
var getFieldSuffix=函数(rowFieldCount){
开关(rowFieldCount){
案例0:
返回“美元”;
案例1:
返回“单位”;
案例2:
返回“百分比”;
违约:
返回
}
};
var replacementMap={
单_空间:'',
点:“$”,
连字符:'''''',
};
var replacer=函数(str){
返回str.replace(/[.-]/g,l=>{
if(l==“)返回replacementMap[“点”];
if(l==“”)返回replacementMap[“single_space”];
返回replacementMap[“连字符”];
});
};
var arrObj=pools.map(函数(池){
返回Object.assign({
[replacer(pool.name)]:[‘美元’、‘单位’、‘百分比’].map(函数(后缀、索引){
返回{
[replacer(pool.name)+getFieldSuffix(索引%3)]:“”
}
})
})
})
console.log(arrObj)
var池=[{
dce:3,
lts:2,
名称:“nift国家”,
},
{
dce:1049.99,
lts:104.999,
名称:“NSG识别号标记选择”,
},
{
dce:162,
lts:36.157,
名称:“班组标记选择”,
}
]
var getFieldSuffix=函数(rowFieldCount){
开关(rowFieldCount){
案例0:
返回“美元”;
案例1:
返回“单位”;
案例2:
返回“百分比”;
违约:
返回
}
};
var replacementMap={
单_空间:'',
点:“$”,
连字符:'''''',
};
var replacer=函数(str){
返回str.replace(/[.-]/g,l=>{
if(l==“)返回replacementMap[“点”];
if(l==“”)返回replacementMap[“single_space”];
返回replacementMap[“连字符”];
});
};
var arrObj=pools.map(函数(池){
常量obj={};
[‘美元’、‘单位’、‘百分比’].forEach(函数(后缀、索引){
obj[replacer(pool.name)+getFieldSuffix(索引%3)]=''
})
返回Object.assign({
[替换者(池名称)]:obj
})
})
console.log(arrObj)
var池=[{
dce:3,
lts:2,
名称:“nift国家”,
},
{
dce:1049.99,
lts:104.999,
名称:“NSG识别号标记选择”,
},
{
dce:162,
lts:36.157,
名称:“班组标记选择”,
}
]
var getFieldSuffix=函数(rowFieldCount){
开关(rowFieldCount){
案例0:
返回“美元”;
案例1:
返回“单位”;
案例2:
返回“百分比”;
违约:
返回
}
};
var replacementMap={
单_空间:'',
点:“$”,
连字符:'''''',
};
var replacer=函数(str){
返回str.replace(/[.-]/g,l=>{
if(l==“)返回replacementMap[“点”];
if(l==“”)返回replacementMap[“single_space”];
返回replacementMap[“连字符”];
});
};
var arrObj=pools.map(函数(池){
常量obj={};
[‘美元’、‘单位’、‘百分比’].forEach(函数(后缀、索引){
obj[replacer(pool.name)+getFieldSuffix(索引%3)]=''
})
返回Object.assign({
[替换者(池名称)]:obj
})
})
console.log(arrObj)
您可以使用reduce()方法代替map()

像这样:

return Object.assign({
    [replacer(pool.name)]: ['Dollars', 'Units', 'Percentage'].reduce(function(acc, suffix, index) { 
        acc[replacer(pool.name) + getFieldSuffix(index % 3)] = ''; 
        return acc;
     }, {})
  })
区别在于,使用map时,返回一个数组。使用reduce返回累加器的结果,在本例中,它是一个对象,然后被修补到父对象中

然后可以将其应用于整个变换,如下所示:

var arrObj = pools.reduce(function(acc, pool) {
  acc[replacer(pool.name)] = ['Dollars', 'Units', 'Percentage'].reduce(function(acc, suffix, index) { 
        acc[replacer(pool.name) + getFieldSuffix(index % 3)] = ''; 
        return acc;
     }, {});
   return acc;
}, {})
可以使用reduce()方法代替map()

像这样:

return Object.assign({
    [replacer(pool.name)]: ['Dollars', 'Units', 'Percentage'].reduce(function(acc, suffix, index) { 
        acc[replacer(pool.name) + getFieldSuffix(index % 3)] = ''; 
        return acc;
     }, {})
  })
区别在于,使用map时,返回一个数组。使用reduce返回累加器的结果,在本例中,它是一个对象,然后被修补到父对象中

然后可以将其应用于整个变换,如下所示:

var arrObj = pools.reduce(function(acc, pool) {
  acc[replacer(pool.name)] = ['Dollars', 'Units', 'Percentage'].reduce(function(acc, suffix, index) { 
        acc[replacer(pool.name) + getFieldSuffix(index % 3)] = ''; 
        return acc;
     }, {});
   return acc;
}, {})

好了,你很接近

var pools = [{
    dce: 3,
    lts: 2,
    name: "nift nation",
  },
  {
    dce: 1049.99,
    lts: 104.999,
    name: "NSG I.NS. Mark Select",
  },
  {
    dce: 162,
    lts: 36.157,
    name: "Shift-Team Mark Select",
  }
]

var getFieldSuffix = function(rowFieldCount) {
  switch (rowFieldCount) {
    case 0:
      return 'Dollars';
    case 1:
      return 'Units';
    case 2:
      return 'Percentage';
    default:
      return
  }
};

var replacementMap = {
  single_space: '_',
  dot: '$',
  hyphen: '__',
};

var replacer = function(str) {
  return str.replace(/[ .-]/g, l => {
    if (l == ".") return replacementMap["dot"];
    if (l == " ") return replacementMap["single_space"];
    return replacementMap["hyphen"];
  });
};

var arrObj = Object.assign(...pools.map((pool) => {
  return {
    [replacer(pool.name)]: Object.assign(...['Dollars', 'Units', 'Percentage'].map(function(suffix, index) {
      return {
        [replacer(pool.name) + getFieldSuffix(index % 3)]: ''
      }
    }))
  }
}))

console.log(arrObj)

好了,你很接近

var pools = [{
    dce: 3,
    lts: 2,
    name: "nift nation",
  },
  {
    dce: 1049.99,
    lts: 104.999,
    name: "NSG I.NS. Mark Select",
  },
  {
    dce: 162,
    lts: 36.157,
    name: "Shift-Team Mark Select",
  }
]

var getFieldSuffix = function(rowFieldCount) {
  switch (rowFieldCount) {
    case 0:
      return 'Dollars';
    case 1:
      return 'Units';
    case 2:
      return 'Percentage';
    default:
      return
  }
};

var replacementMap = {
  single_space: '_',
  dot: '$',
  hyphen: '__',
};

var replacer = function(str) {
  return str.replace(/[ .-]/g, l => {
    if (l == ".") return replacementMap["dot"];
    if (l == " ") return replacementMap["single_space"];
    return replacementMap["hyphen"];
  });
};

var arrObj = Object.assign(...pools.map((pool) => {
  return {
    [replacer(pool.name)]: Object.assign(...['Dollars', 'Units', 'Percentage'].map(function(suffix, index) {
      return {
        [replacer(pool.name) + getFieldSuffix(index % 3)]: ''
      }
    }))
  }
}))

console.log(arrObj)
最佳(也是显而易见的)解决方案:重构代码,使其返回您想要的内容(其他方法已经提供)

但是,为了获得更通用的解决方案(如果您只得到报告的结果,而没有原始数据),您可以根据您的规范对其进行转换:

const formattedResult = Object.assign.apply(null, arrObj.map(function(o){
    let k=Object.keys(o)[0];
    return {[k]:Object.assign.apply(null, o[k])};
}));
console.log(formattedResult);
最佳(也是显而易见的)解决方案:重构代码,使其返回您想要的内容(其他方法已经提供)

但是,为了获得更通用的解决方案(如果您只得到报告的结果,而没有原始数据),您可以根据您的规范对其进行转换:

const formattedResult = Object.assign.apply(null, arrObj.map(function(o){
    let k=Object.keys(o)[0];
    return {[k]:Object.assign.apply(null, o[k])};
}));
console.log(formattedResult);

我把
yourResult
放在变量
arrObj
的位置(我刚刚编辑了我的答案以匹配您的代码,所以现在您只需将其粘贴到自己的答案的末尾即可看到结果)。无论如何,正如我所说,正确的解决方案是修改代码,而不是转换错误的结果。我这样做只是为了好玩,并发布了它,因为我认为如果您不能修改原始代码,它可能会很有趣。;-。。。事实上,我原谅了从我的测试材料中删除JSON.stringify()调用(已修复)。对不起,我把
yourResult
放在
arrObj
变量的位置(我刚刚编辑了我的答案以匹配您的代码,所以现在您只需将其粘贴到您自己的答案的末尾即可查看结果)。无论如何,正如我所说,正确的解决方案是修改代码,而不是转换错误的结果。我这样做只是为了好玩,并发布了它,因为我认为如果您不能修改原始代码,它可能会很有趣。;-。。。事实上,我原谅了从我的测试材料中删除JSON.stringify()调用(已修复)。对不起,我想要一个对象的对象,类似这样的…{code>{“nift_nation”:“{”nift_nationDollars”:““nift_nationUnits”:““nift_nationPercentage”:“},{”NSG_I$NS$\u Mark\u Select”:“{”NSG_I$NS$\u Mark\u SelectUnits”:““NSG_I$NS$\u Mark\u SelectUnits”:“,”NSG_I$NS$\u SelectPercentage”:“,”,