从对象数组动态创建对象数组,按对象属性排序

时间:2018-03-16 13:56:30

标签: javascript arrays

我试图根据每个对象上的属性来匹配和分组对象,并将它们放在自己的数组中,我可以使用它来稍后对某些选择条件进行排序。排序方法对我来说不是一个选项,因为我需要对属性的4个不同值进行排序。

如何为具有匹配属性的对象动态创建单独的数组?

例如,如果我知道form.RatingNumber将是1,2,3或4,我可以这样做:

var ratingNumOne = [],
    ratingNumTwo,
    ratingNumThree,
    ratingNumFour;

      forms.forEach(function(form) {
      if (form.RatingNumber === 1){
         ratingNumOne.push(form);
} else if (form.RatingNumber === 2){
     ratingNumTwo.push(form)
} //and so on...    
  });

问题是form.RatingNumber属性可以是任何数字,因此硬编码1,2,3,4将不起作用。

如何通过每个RatingNumber动态地对表单进行分组?

6 个答案:

答案 0 :(得分:1)

尝试使用reduce函数,如下所示:

{{1}}

结果将是对象,每个键都是评级编号,值是具有此评级编号的表单。 这对任何评级号码都是动态的

答案 1 :(得分:0)

您可以使用对象并以form.RatingNumber为键。

如果基于零的值没有间隙,则可以使用数组而不是对象。

var ratingNumOne = [],
    ratingNumTwo = [],
    ratingNumThree = [],
    ratingNumFour = [],
    ratings = { 1: ratingNumOne, 2: ratingNumTwo, 3: ratingNumThree, 4: ratingNumFour };

// usage
ratings[form.RatingNumber].push(form);

答案 2 :(得分:0)

尝试使用“RatingNumber”作为属性创建一个对象:

  rating = {};
    forms.forEach(function(form) {
        if( !rating[form.RatingNumber] ){
            rating[form.RatingNumber] = []
        }
        rating[form.RatingNumber].push( form )
    })

答案 3 :(得分:0)

尝试这是一项工作:

forms.forEach(form => {
if (!window['ratingNumber' + form.RatingNumber]) window['ratingNumber' + form.RatingNumber] = [];
window['ratingNumber' + form.RatingNumber].push(form);
});

这将自动创建变量。最后它看起来像这样:

ratingNumber1 = [form, form, form];
ratingNumber2 = [form, form];
ratingNumber100 = [form];

但要注意ratingNumber3(例如)也可能未定义。

只是说它,你的解决方案毫无意义,但这个版本起作用了。

答案 4 :(得分:0)

使用RatingNumber获得的数字并不重要,只需将其用作索引即可。结果将是一个以RatingNumber作为索引的对象和一个以RatingNumber为值的对象数组。



//example input
var forms = [{RatingNumber:5 }, {RatingNumber:6}, {RatingNumber:78}, {RatingNumber:6}];
var results = {};
$.each(forms, function(i, form){
    if(!results[form.RatingNumber])
        results[form.RatingNumber]=[];
   	results[form.RatingNumber].push(form); 		
});
console.log(results);

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
&#13;
&#13;
&#13;

HIH

答案 5 :(得分:0)

// Example input data
let forms = [{RatingNumber: 1}, {RatingNumber: 4}, {RatingNumber: 2}, {RatingNumber: 1}],
    result = [];

forms.forEach(form => {
    result[form.RatingNumber]
        ? result[form.RatingNumber].push(form)
        : result[form.RatingNumber] = [form];
});

// Now `result` have all information. Next can do something else..

let getResult = index => {
    let res = result[index] || [];
    // Write your code here. For example VVVVV
    console.log(`Rating ${index}: ${res.length} count`)
    console.log(res)
}

getResult(1)
getResult(2)
getResult(3)
getResult(4)