我有这样的数组,
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"}
我正在诚实地尝试很多事情,但我不能让它发挥作用。
请帮忙。
答案 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个桶,每种颜色的水果(颜色只是一块水果的属性)。所以你会:
我们创建的是一种按颜色分类水果的算法。你要解决的问题非常相似。在伪代码中它将是:
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或其他)但不要让像数组或字典这样的数据结构吓跑你。如果它有帮助,可以用更简单的术语来思考。