删除对象列表中不需要的对象

JS - Deleting unnecessary objects inside a list of objects

本文关键字:对象 不需要 列表 删除      更新时间:2023-09-26

我的Node服务器中有一个对象,它包含数千个对象,每个对象是一个人,他有一个totalScore。它看起来像这样:

var mainObject = { //it's unsorted, but no need to sort it anyway
    john: {totalScore: 5, info: "No"},
    james: {totalScore: 3, info: "No"},
    lee: {totalScore: 55, info: "No"}
}

现在,我想在我的mainObject中保留1000个对象,但问题是我需要在发送到客户端之前使用delete mainObject[name]擦除最低分数(可以接受除delete以外的其他解决方案)。

mainObject内部的每个对象的索引不应该彼此交换(有一个原因),只是最低的分数需要去,列表应该作为一个对象发送到客户端,并且长度恰好为1000。

您正在尝试将基于数组的概念(如长度和排序)应用于对象。那可不行。

要实现你想要的,你必须将你的对象转换为数组。你可以这样做:

var mainObject = {
    john: {totalScore: 5, info: "No"},
    james: {totalScore: 3, info: "No"},
    lee: {totalScore: 55, info: "No"},
};
var mainArray = Object.keys(mainObject).map(function (name) {
  return Object.assign({}, mainObject[name], {name});
});
console.log(mainArray);

你可以按分数排序你的数组,只返回N个最高的条目:

var mainArray = [
  {
    "totalScore": 5,
    "info": "No",
    "name": "john"
  },
  {
    "totalScore": 3,
    "info": "No",
    "name": "james"
  },
  {
    "totalScore": 55,
    "info": "No",
    "name": "lee"
  }
]
mainArray.sort(function (a, b) {
  return b.totalScore - a.totalScore;
});
console.log(mainArray.slice(0, 1000));

如果出于某种原因你的客户端绝对需要返回一个对象而不是一个对象数组,你总是可以转换回来:

var mainArray = [
  {
    "totalScore": 5,
    "info": "No",
    "name": "john"
  },
  {
    "totalScore": 3,
    "info": "No",
    "name": "james"
  },
  {
    "totalScore": 55,
    "info": "No",
    "name": "lee"
  }
];
var mainObject = mainArray.reduce(function (prev, curr) {
  var name = curr.name;
  delete curr.name;
  prev[name] = curr;
  return prev;
}, {});
console.log(mainObject);

但是在这一点上,你已经做了相当多的工作来实现你的目标。这意味着这实际上是一个XY问题,您应该重新考虑导致您出现这种情况的决策。

使用lodash
var desiredAmountOfObjects = 2
var mainObject = { //it's unsorted, but no need to sort it anyway
    john: {totalScore: 5, info: "No"},
    james: {totalScore: 3, info: "No"},
    lee: {totalScore: 55, info: "No"}
}
var mainArray = _.map(mainObject, (value, key) => Object.assign(value, { key }))
mainArray.sort(function (a, b) {
  return b.totalScore - a.totalScore;
});
var choppingBlock = mainArray.slice(desiredAmountOfObjects).map(chop => chop.key)
console.log(choppingBlock);
var desiredObject = _.omitBy(mainObject, (value, key) => choppingBlock.indexOf(key) > -1)
console.log(desiredObject)

http://jsbin.com/gijuduzole/1/edit?js,控制台

设置desiredAmountOfObject为1000或其他值

根据注释-从初始对象创建一个您可以排序的数组,然后取除x外的所有结果,并从初始对象中删除这些结果。

// object
var mainObject = { //it's unsorted, but no need to sort it anyway
        john: {totalScore: 5, info: "No"},
        james: {totalScore: 3, info: "No"},
        lee: {totalScore: 55, info: "No"}
    }
// array
var array = [];
for (var i in mainObject)
array.push({ key: i, score: mainObject[i].totalScore });
// sort
array.sort(function(a,b){ return a.score < b.score });
// keep top x
var remove = array.slice(2);
// delete all the others
for (var i=0; i<remove.length; i++)
delete mainObject[remove[i].key];
console.log(mainObject);

小提琴:https://jsfiddle.net/xrc8hpya/1/

您可以使用对象。键和数组迭代方法:

const mainObject = {
    john: {totalScore: 5, info: "No"},
    james: {totalScore: 3, info: "No"},
    lee: {totalScore: 55, info: "No"}
};
const keys = Object.keys(mainObject);
const lowest = keys.map(key => mainObject[key].totalScore).sort()[0];
const removed = keys.reduce((result, key) => {
    if(mainObject[key].totalScore > lowest){
        result[key] = mainObject[key];
    }
    return result;
}, Object.create(null));
console.log('without objects with lowest score');
console.log(removed);
// EDIT -- Or, to retain keys:
const removed2 = keys.reduce((result, key) => {
    result[key] = mainObject[key].totalScore > lowest
        ? mainObject[key]
        : undefined;
    return result;
}, Object.create(null));
console.log('retaining all keys');
console.log(removed2);

引用

Array.prototype.map
Array.prototype.reduce

有很多库可以帮助您解决这类问题(underscore, lodash, ramda)。
一个使用ramda的例子:

const mainObject = { //it's unsorted, but no need to sort it anyway
    john: {totalScore: 5, info: "No"},
    james: {totalScore: 3, info: "No"},
    lee: {totalScore: 55, info: "No"}
}
const obj = R.filter((person) => person.totalScore > 50, mainObject);

这样你就不必担心转换为数组,只需应用过滤器,你就会得到对象