根据它的关键字对不同的数组进行分组

时间:2018-03-29 15:59:33

标签: javascript

我有这样的数组,

    public TokenGenerator()
    {
        var builder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("settings.json");
        _configuration = builder.Build();

        _tokenServiceSettings = new TokenServiceSettings()
        {
            Audience = _configuration.GetSection("JwtBearer:Audience").Value
        };
    }

我希望将上面的数组分组到基于pure_id的单个数组中,所以结果数组将在下面,而索引将是pure_id索引

   0: {"pure_id":"1","branch_id":"45"}
   1: {"pure_id":"2","branch_id":"45"}
   2:  {"pure_id":"3","branch_id":"45"}
   3:  {"pure_id":"3","branch_id":"45"}

我正在诚实地尝试很多事情,但我不能让它发挥作用。

请帮忙。

4 个答案:

答案 0 :(得分:0)

 const result = [];

 for(const el of array) 
  (result[el.pure_id] || (result[el.pure_id] = [])).push(el);

答案 1 :(得分:0)

使用 new 对象文字的rest和spread语法,属性表达式语法和.reduce()使这简单而简单。



var arr = [
 {"pure_id":"1","branch_id":"45"},
 {"pure_id":"2","branch_id":"45"},
 {"pure_id":"3","branch_id":"45"},
 {"pure_id":"3","branch_id":"45"}
];

var result = arr.reduce((res, {pure_id, ...props}) =>
  ({...res, [pure_id]: (res[pure_id] || []).concat({pure_id, ...props})})
, {});

console.log(result);




.reduce()当然只是创建一个新对象。每次迭代都会获取累积的属性并将它们添加到对象文字中,但pure_id是当前对象(副本)到数组的属性的串联。

答案 2 :(得分:0)

如果不使用reduce,则代码如下:

假设您的预期结果是一个数组,如: [[{'pure_id':0, 'branch_id':1}], [{'pure_id':1, 'branch_id':2}]]

//assuming your array is like below:
var test = [{"pure_id":"1","branch_id":"43"},
   {"pure_id":"2","branch_id":"44"},
   {"pure_id":"3","branch_id":"45"},
   {"pure_id":"3","branch_id":"46"}]

var result = []
var index_db = {} //use dict to save the mapping between the index of result and pure_id
var index = 0
test.forEach(function(item){
  if(item.pure_id in index_db){
    result[index_db[item.pure_id]].push(item)
  }
  else{
    result.push([item])
    index_db[item.pure_id] = index++
  }
});
console.log(result)

以下是一个简化版本:

//assuming your array is like below:
var test = [{"pure_id":"1","branch_id":"43"},
   {"pure_id":"2","branch_id":"44"},
   {"pure_id":"3","branch_id":"45"},
   {"pure_id":"3","branch_id":"46"}]

result = test.reduce(function(pre, cur){
  if(cur['pure_id'] in pre['indexes']){
    pre['result'][pre['indexes'][cur['pure_id']]].push(cur)
  }
  else{
    pre['result'].push([cur])
    pre['indexes'][cur['pure_id']] = pre['pos']++
  }
  return pre
}, {'pos':0, 'indexes':{}, 'result':[]})
console.log(result['result'])

答案 3 :(得分:0)

我经常看到人们在编程中遇到困难,但在编程之外不会有问题。您可以将其视为水果,而不是数组和对象。

想象一桶水果。你想要将一桶水果分成1个桶,每种颜色的水果(颜色只是一块水果的属性)。所以你会:

  1. 一次抓一个水果
  2. 弄清楚它的颜色
  3. 如果没有该颜色的桶,请获取一个
  4. 将水果放入适当的桶中
  5. 重复,直到没有果实
  6. 我们创建的是一种按颜色分类水果的算法。你要解决的问题非常相似。在伪代码中它将是:

    for each fruit
      color = fruit.color
      if not bucket[color]
        make bucket[color]
      put fruit in bucket[color]
    

    将其转换为JS

    var fruits = [
     {color: "red"},
     {color: "orange"},
     {color: "pink"},
     {color: "red"}
    ];
    
    var buckets = {};
    
    for (var i=0; i<fruits.length; i++) {
      var fruit = fruits[i];
      var color = fruit.color;
      if (!buckets[color])
        buckets[color] = [];
      buckets[color].push(fruit);
    }
    

    现在,如果您想使用您的阵列,算法保持不变,您只需更换部件。

    var things = [
     {"pure_id":"1","branch_id":"45"},
     {"pure_id":"2","branch_id":"45"},
     {"pure_id":"3","branch_id":"45"},
     {"pure_id":"3","branch_id":"45"}
    ];
    
    var grouped = [];
    for (let i=0; i<things.length; i++) {
      var thing = things[i];
      var id = thing['pure_id'];
      if (!grouped[id])
        grouped[id] = [];
      grouped[id].push(thing);
    }
    console.log(grouped)

    所以,我们处于第一个解决方案。有用!有更好的解决方案(使用reduce,forEach或其他)但不要让像数组或字典这样的数据结构吓跑你。如果它有帮助,可以用更简单的术语来思考。