javascript - 具有某些重量年龄值的对象值数组未按正确顺序排列

标签 javascript

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

let messageScoreData = {
  messagescore: [
    {
      userid: "5bacc8c6563a882a1ca7756a",
      score: 2605.4
    },
    {
      userid: "5bacc98431481e0520856df8",
      score: 1013.2
    },
    {
      userid: "5bc6d0bb26f1bb1b44a790c6",
      score: 41
    },
    {
      userid: "5bc6d0bb26f1bb1b44a790c9",
      score: 29
    }
  ],
  messagescorebefore: [
    {
      userid: "5bacc8c6563a882a1ca7756a",
      score: 3754
    },
    {
      userid: "5bacc98431481e0520856df8",
      score: 1259.8
    },
    {
      userid: "5bc6d0bb26f1bb1b44a790c6",
      score: 98
    },
    {
      userid: "5bced078d62b321d08f012af",
      score: 22
    },
    {
      userid: "5bcec1ad11302529f452b31e",
      score: 6
    },
    {
      userid: "5c10afec8c587d2fac8c356e",
      score: 6
    },
    {
      userid: "5c07b7f199848528e86e9359",
      score: 3
    },
    {
      userid: "5bed1373f94b611de4425259",
      score: 2
    },
    {
      userid: "5c21ccff833a5006fc5a98af",
      score: 2
    },
    {
      userid: "5c21ccff82e32c05c4043410",
      score: 1
    }
  ]
};

现在我们将提供权重-年龄值,即 messagescorebefore 数组的值为 0.4,messagescore 的值为 0.6; 为此,我有一个算法,它用体重-年龄值对值进行排序。即

var result = messageScoreData;

var columns = [
  {
    name: "messagescorebefore",
    value: 0.4
  },
  {
    name: "messagescore",
    value: 0.6
  }
];

var total = {};

for (let column of columns) {
  for (let userid of result[column.name]) {
    var alphabet = userid.userid;
    if (total[alphabet]) {
      total[alphabet] += column.value;
    } else {
      total[alphabet] = column.value;
    }
  }
}
const valueholder = Object.keys(total)
  .map(key => ({ name: key, value: total[key] }))
  .sort((f, s) => s.value - f.value);
console.log(valueholder); 

通过这个 Algo 输出是:

[ { name: '5bacc8c6563a882a1ca7756a', value: 1 },
  { name: '5bc6d0bb26f1bb1b44a790c6', value: 1 },
  { name: '5bacc98431481e0520856df8', value: 1 },
  { name: '5bc6d0bb26f1bb1b44a790c9', value: 0.6 },
  { name: '5bcec1ad11302529f452b31e', value: 0.4 },
  { name: '5bced078d62b321d08f012af', value: 0.4 },
  { name: '5c07b7f199848528e86e9359', value: 0.4 },
  { name: '5bed1373f94b611de4425259', value: 0.4 },
  { name: '5c21ccff833a5006fc5a98af', value: 0.4 },
  { name: '5c21ccff82e32c05c4043410', value: 0.4 },
  { name: '5c10afec8c587d2fac8c356e', value: 0.4 } ]

问题是用户标识:“5bacc98431481e0520856df8”将出现在两个数组的第二个位置,但在最终计算后,它将出现在第三个位置之下,这是错误的。 预期的输出将是这样的:

[     { name: '5bacc8c6563a882a1ca7756a', value: 1 },
      { name: '5bacc98431481e0520856df8', value: 1 },
      { name: '5bc6d0bb26f1bb1b44a790c6', value: 1 },
      { name: '5bc6d0bb26f1bb1b44a790c9', value: 0.6 },
      { name: '5bced078d62b321d08f012af', value: 0.4 },
      { name: '5bcec1ad11302529f452b31e', value: 0.4 },
      { name: '5c10afec8c587d2fac8c356e', value: 0.4 },
      { name: '5c07b7f199848528e86e9359', value: 0.4 },
      { name: '5bed1373f94b611de4425259', value: 0.4 },
      { name: '5c21ccff833a5006fc5a98af', value: 0.4 },
]

非常感谢任何帮助。提前致谢

最佳答案

实际上,您希望保留元素的相对顺序。正常的排序功能不能保证保持相对顺序。所以我们需要一些技巧来保持相对顺序,如下所示。

let messageScoreData = {
    messagescore: [
        {
            userid: "5bacc8c6563a882a1ca7756a",
            score: 2605.4
        },
        {
            userid: "5bacc98431481e0520856df8",
            score: 1013.2
        },
        {
            userid: "5bc6d0bb26f1bb1b44a790c6",
            score: 41
        },
        {
            userid: "5bc6d0bb26f1bb1b44a790c9",
            score: 29
        }
    ],
    messagescorebefore: [
        {
            userid: "5bacc8c6563a882a1ca7756a",
            score: 3754
        },
        {
            userid: "5bacc98431481e0520856df8",
            score: 1259.8
        },
        {
            userid: "5bc6d0bb26f1bb1b44a790c6",
            score: 98
        },
        {
            userid: "5bced078d62b321d08f012af",
            score: 22
        },
        {
            userid: "5bcec1ad11302529f452b31e",
            score: 6
        },
        {
            userid: "5c10afec8c587d2fac8c356e",
            score: 6
        },
        {
            userid: "5c07b7f199848528e86e9359",
            score: 3
        },
        {
            userid: "5bed1373f94b611de4425259",
            score: 2
        },
        {
            userid: "5c21ccff833a5006fc5a98af",
            score: 2
        },
        {
            userid: "5c21ccff82e32c05c4043410",
            score: 1
        }
    ]
};

var result = messageScoreData;

var columns = [
    {
        name: "messagescorebefore",
        value: 0.4
    },
    {
        name: "messagescore",
        value: 0.6
    }
];

var total = [];

for (let column of columns) {
    for (let userid of result[column.name]) {
        var alphabet = userid.userid;
        if (total[alphabet]) {
            total[alphabet] += column.value;
        } else {
            total[alphabet] = column.value;
        }
    }
}

let res = Object.keys(total).map((k, idx) => {
    return {
        name: k,
        value: total[k],
        index: idx
    }
})
var output = res.sort((f, s) => {
    if (s.value < f.value) return -1;
    if (s.value > f.value) return 1;
    return f.index - s.index
})
console.log("output : ", output)

关于javascript - 具有某些重量年龄值的对象值数组未按正确顺序排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53946619/

相关文章:

javascript - Ember : Resolve complex async promises

javascript - Chrome API 不会在嵌套回调中注入(inject) cookie

javascript - 同时搜索两个网站并将结果并排显示在一页上

javascript - 为什么分配给属性会导致错误 "cannot set property of null"

c# - asp.net 和 javascript 中的正则表达式语法是否相同?

javascript - element.sortable 不是一个函数 Angular

javascript - 如何在javascript中制作一个切换按钮来改变div的背景、<p>标签的文本以及在两组div之间切换

javascript - 如何通过主干中的 ajax 调用使用其模型渲染多个 View

javascript - 将事件监听器添加到 Gmail 发送按钮

javascript - Jquery 拖放元素保留在列表中并创建另一个