我对javascript有点陌生。这里我有以下对象:
obj = {
0:{id:1, location: loc1, title:title1},
1:{id:2, location: loc2, title:title2},
2:{id:3, location: loc1, title:title3},
3:{id:4, location: loc3, title:title4},
4:{id:5, location: loc1, title:title5}
}
我需要根据对象的值按位置过滤对象并创建一个新对象,如下所示:
obj = {
loc1:{
0:{id:1, location: loc1, title:title1},
1:{id:3, location: loc1, title:title3},
2:{id:5, location: loc1, title:title5}
},
loc2:{
0:{id:2, location: loc2, title:title2}
}
loc3:{
0:{id:4, location: loc3, title:title4}
}
}
如何实现上述目的?
我尝试将for
和push
用于新的array
,但是位置应该是动态的,并且将来可能会改变,所以我想像上面一样管理一个对象。 / p>
var theLoc1 = [], theLoc2 = [];
for(var i = 0; i < response.length; i++) {
if(response[i].location == 'loc1'){
theLoc1.push(response[i]);
}else if(response[i].location == 'loc2'){
theLoc2.push(response[i]);
}
}
答案 0 :(得分:2)
此代码是您真正需要的:
obj = [
{ id: 1, location: 'loc1', title: 'title1' },
{ id: 2, location: 'loc2', title: 'title2' },
{ id: 3, location: 'loc1', title: 'title3' },
{ id: 4, location: 'loc3', title: 'title4' },
{ id: 5, location: 'loc1', title: 'title5' }
];
var locations = {};
for (var i = 0; i < obj.length; i++) {
locations[obj[i].location] = [];
}
console.log(locations);
for (var i = 0; i < obj.length; i++) {
locations[obj[i].location].push(obj[i]);
}
console.log(locations);
**更新:可以在单个for循环中完成,但出于简单原因,我这样写。 **
答案 1 :(得分:1)
let obj;
for(var i = 0; i < response.length; i++) {
if( !Object.hasOwnProperty(obj, response[i].location)
{ obj[response[i].location] = []; }
obj[response[i].location].push(response[i]);
}
只要解决它们,就可以动态创建JS对象属性。这意味着:
let obj = {};
obj.bark = "how-how";
console.log(obj.bark); // "how-how";
obj[bark2] = "waf-waf";
console.log(obj.bark2); // "waf-waf";
您可以使用它来使用位置名称来构造新对象,因此即使有一天获得“ location999”,它仍然可以使用。
我放置了if
来检查对象已具有该属性,因为您希望该属性为数组。如果不是这样,您可以像在我的示例中那样将值放入内部,但是我不确定push
是否适用于此,因此我将其初始化为空数组,以防万一。您可以自己检查它,并在不需要if
时忽略它。
答案 2 :(得分:1)
我使用函数式编程的解决方案。
const obj = {
0: { id: 1, location: 'loc1', title: 'title1' },
1: { id: 2, location: 'loc2', title: 'title2' },
2: { id: 3, location: 'loc1', title: 'title3' },
3: { id: 4, location: 'loc3', title: 'title4' },
4: { id: 5, location: 'loc1', title: 'title5' }
};
const result = Object.keys(obj).reduce((newObject, item) => {
const location = obj[item].location;
const index = newObject[location] ? Object.keys(newObject[location]).length : 0;
return {
...newObject,
[location]: {
...newObject[location],
[index]: obj[item]
}
};
}, {});
console.log(result);
答案 3 :(得分:1)
为了按位置对项目进行分组,您可以迭代数组,查看其位置是否已分组,如果没有,则为其创建一个新的组。然后将该项目添加到相应的组中。
var obj = [
{id: 1, location: "loc1", title: "title1"},
{id: 2, location: "loc2", title: "title2"},
{id: 3, location: "loc1", title: "title3"},
{id: 4, location: "loc3", title: "title4"},
{id: 5, location: "loc1", title: "title5"}
];
var formattedArray = new Array();
for (var i = 0; i < obj.length; i++) {
if (!formattedArray[obj[i].location]) {
formattedArray[obj[i].location] = new Array();
}
formattedArray[obj[i].location].push(obj[i]);
}
console.log(formattedArray);
JsFiddle示例代码: JsFiddle
答案 4 :(得分:0)
如果loc1,loc2,loc3是固定的,则可以尝试以下操作。 (这是我在阅读查询后所了解的内容)
-nodeletionpartial
答案 5 :(得分:-1)
我认为更好的方法是将已经在后端的对象分组。您可以使用linq函数.GroupBy(x => x.location)
。
这几乎是相同的问题: How to count rows of a table grouped by shortdatestring?
答案 6 :(得分:-1)
// create an array of arrays;
var groupOfLocations[];
// loop on your locations
for(var i = 0; i < response.length; i++) {
// push if already existing
for(var iGroup = 0; iGroup < groupOfLocations.length; iGroup++) {
if(groupOfLocations[iGroup][0].location == response[i].location) {
groupOfLocations[iGroup].push(response[i]); break;
}
// create a new array if not found
if(iGroup >= groupOfLocations.length) groupOfLocations.push(new array(response[i]));
}
可能包含语法错误,但想法在这里。