在分组数组元素和执行某些逻辑时键入脚本问题

时间:2018-01-22 10:33:24

标签: javascript typescript

我有一组对象,如下面的

[{name: 'India', language: 'Hindi'}, 
{name: 'US', language: 'English'},
{name: 'US', language: 'Spanish'},
{name: 'India', language: 'Bengali'},
{name: 'Japan', language: 'Japanese'},
{name: 'China', language: 'Mandarin'},
{name: 'France', language: 'French'}]

我正在尝试从中生成一个数组,这样如果任何国家/地区(名称)有多种语言,我会尝试将“很多”显示为语言属性。

在上面的例子中,结果数组应该如下所示

 [{name: 'India', language: 'many'}, 
  {name: 'US', language: 'many'}, 
  {name: 'Japan', language: 'Japanese'},
  {name: 'China', language: 'Mandarin'},
  {name: 'France', language: 'French'},]

我尝试使用forEach循环,但没有得到如何实现这个逻辑。因为我是棱角分明2和打字稿的新手..你能不能建议。

2 个答案:

答案 0 :(得分:1)

使用 forEach

var arr = [{name: 'India', language: 'Hindi'}, 
{name: 'US', language: 'English'},
{name: 'US', language: 'Spanish'},
{name: 'India', language: 'Bengali'},
{name: 'Japan', language: 'Japanese'},
{name: 'China', language: 'Mandarin'},
{name: 'France', language: 'French'}]

var out= []
arr.forEach((ele)=> {
  var o = out.find(item => item.name === ele.name);
  if (o!== undefined) o.language = 'many'
  else out.push(ele)
})

答案 1 :(得分:0)

使用.reduce

非常简单



var input = [{name: 'India', language: 'Hindi'}, 
{name: 'US', language: 'English'},
{name: 'US', language: 'Spanish'},
{name: 'India', language: 'Bengali'},
{name: 'Japan', language: 'Japanese'},
{name: 'China', language: 'Mandarin'},
{name: 'France', language: 'French'}];

var result = input.reduce( function (p,c){
   // find an item in  the result with the same name
   var index = p.findIndex(function(x){ return x.name == c.name});

   if(index == -1){
       // if not found already add to the result list
       p.push(c);
   }
   else{
     // item with same name already exists - update the language to 'many'
     p[index].language = 'many';
   }
   return p;
}, []);

console.log(result);