根据javascript中字段的值过滤对象

时间:2019-08-05 12:16:21

标签: javascript jquery

我对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}
    }
}

如何实现上述目的?

我尝试将forpush用于新的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]);
  }
}

7 个答案:

答案 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])); 
}

可能包含语法错误,但想法在这里。