javascript - 通过对象数组中的值为对象分配等级

标签 javascript arrays sorting lodash ranking

我有一个像这样的对象数组:

var data = {
    a: [
        { keyone:'c', keytwo: 'anna', keythree: 21, keyfour: 15 },
        { keyone:'a', keytwo: 'anna', keythree: 22, keyfour: 15 },
        { keyone:'s', keytwo: 'anna', keythree: 10, keyfour: 15 },
        { keyone:'v', keytwo: 'anna', keythree: 7, keyfour: 15 }
    ],

    b: [
        { keyone:'f', keytwo: 'any', keythree: 45, keyfour: 100 },
        { keyone:'b', keytwo: 'any', keythree: 146, keyfour: 100 },
        { keyone:'t', keytwo: 'any', keythree: 23, keyfour: 100 },
        { keyone:'h', keytwo: 'any', keythree: 11, keyfour: 100 }
    ]
  };

我想根据组内以及整个数据集中的 keythreekeyfour 的值为每个对象分配等级。我该怎么做?

更新:我在上面的代码中描述了等级。

结果对象:

var data = {
    a: [
        { keyone:'c', keytwo: 'anna', keythree: 21, keyfour: 15, rankgroup: 3, rankall: 4 },

        { keyone:'a', keytwo: 'anna', keythree: 22, keyfour: 15, rankgroup: 4, rankall: 5 },

        { keyone:'s', keytwo: 'anna', keythree: 22, keyfour: 15, rankgroup: 2, rankall: 2 },

        { keyone:'v', keytwo: 'anna', keythree: 7, keyfour: 15, rankgroup: 1, rankall: 1 }
    ],

    b: [
        { keyone:'f', keytwo: 'any', keythree: 45, keyfour: 100 },

        { keyone:'b', keytwo: 'any', keythree: 146, keyfour: 100 },

        { keyone:'t', keytwo: 'any', keythree: 23, keyfour: 100 },

        { keyone:'h', keytwo: 'any', keythree: 11, keyfour: 100 }
    ]
};

我正在使用 lodash。我的想法是首先根据这些键对数组进行排序,然后遍历原始对象,通过比较另一个键插入排序后的索引。这是我尝试过的:

var keys = Object.keys(data);
var result = {};
var numkeys;
for(var i=0; i < keys.length; i++) {
    if(!numkeys) {
        var numkeys = _.keys(_.pick(data[keys[i]][0], _.isNumber));
  }

        for(var j=0;j<numkeys.length;j++) {
    var sorted = _.sortBy(data['a'], numkeys[j]);
        _.forEach(sorted, function(n, k) {

        //THIS FAILS
        var t = _.set(_.where(data[keys[i]], {keyone: n.keyone}), keys[i]+'rank', k);
        console.log(t);
        });

    }
  }

我该怎么做?我的逻辑似乎太复杂了,set 方法并没有按键更新原始对象,而是在主对象之后添加了一个新条目。

更新:注意对象 a 重复出现 22。这会导致分配排名时出现问题,因为 indexOf 将始终返回第一次出现的索引,因此第二次出现的索引永远不会分配给它,因此该值将是未定义的。

最佳答案

我就是这样实现的。

  1. 将所有 keythree 收集到一个数组中并对其进行排序(根据 index 分配 rankall)。

    var all = [];
    _.forEach(data, function (a, key) {
        _.forEach(a, function(n, k){
        all.push(n.keythree);
      });
    });
    all.sort(function(a,b){
        return a-b;
    });
    
  2. 分配等级

    _.forEach(data, function (a, key) {
        var sorted = _.sortBy(a, 'keythree');
        _.forEach(sorted, function(n, k) {
          var index = _.findIndex(data[key], {keyone: n.keyone});
          data[key][index]['rankgroup'] = k+1;
          data[key][index]['rankall'] = all.indexOf(n.keythree)+1;
        });
    });
    

检查这个fiddle


编辑

我正在为骗子创建另一个数组

_.forEach(a, function(n, k) {
    if (all.indexOf(n.keythree) !== -1) {
        dupes.push(n.keythree);
    }
    all.push(n.keythree);
});

并获得这些欺骗项目的全局排名

    function getGlobalRank(n) {
    var val = n.keythree;
    if (sorted_dupes[val] === undefined) {
        sorted_dupes[val] = [];
        _.forEach(data, function(a, key) {
            _.forEach(_.where(a, {
                keythree: val
            }), function(b) {
                sorted_dupes[val].push(b);
            });
        });
        sorted_dupes[val] = _.sortByAll(sorted_dupes[val], ['keyfour', 'keytwo', 'keyone']);
    }
    return _.findIndex(sorted_dupes[val], {
        keyone: n.keyone,
        keytwo: n.keytwo,
        keythree: n.keythree,
        keyfour: n.keyfour
    }) + 1 + all.indexOf(val);
}

看到项目是根据顺序 keythree, keyfour, keytwo, keyone 中的所有属性排序的code>(如果你愿意,你可以在 _.sortByAll 中改变顺序)

代码看起来比我想象的更难看。会尽快更新重构代码

检查fiddle

关于javascript - 通过对象数组中的值为对象分配等级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34745180/

相关文章:

javascript - 新阵列生成的矩阵阵列出现问题

Java比较器使用非final变量

java - 从文件读取的数据在冒泡排序方法中不起作用

javascript - 为什么在 CSS 中将元素显示属性设置为 flex 会更改 'event.target' 的 JS onclick 事件的行为?

javascript - jQuery Ajax中的未定义数据返回

javascript - 图像 slider 导航按钮

C# 初学者 : If an item from a array was found in a string

javascript - 在过滤器数组上切片参数?

javascript - 为什么要在 "new Array(arrayLength)"中设置 arrayLength?

arrays - 奇长数组快速小阶统计算法的正确性