Javascript JS-删除对象列表中不必要的对象

Javascript JS-删除对象列表中不必要的对象,javascript,object,Javascript,Object,我的节点服务器中有一个对象,它包含数千个对象,每个对象都是一个人,他有一个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"} } 现在,我想在

我的节点服务器中有一个对象,它包含数千个对象,每个对象都是一个人,他有一个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以外的其他解决方案)


main对象中每个对象的索引不应相互切换(这是有原因的),只需取最低分数,列表应作为一个对象发送给客户端,且长度正好为1000。

您正在尝试对对象应用基于数组的概念,如长度和顺序。那根本不行

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

var mainObject={
约翰:{总分:5,信息:“否”},
詹姆斯:{总分:3,信息:“否”},
李:{总分:55,信息:“否”},
};
var mainArray=Object.keys(mainObject.map)(函数名){
返回Object.assign({},mainObject[name],{name});
});

console.log(mainArray)有很多库可以帮助您解决此类问题(下划线、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);
这样,您就不必担心转换为数组,只需应用过滤器,就可以获得对象。

使用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)


将desiredAmountOfObject设置为1000或其他任何值。

您可以使用 Object.key和数组迭代方法:

const main对象={
约翰:{总分:5,信息:“否”},
詹姆斯:{总分:3,信息:“否”},
李:{总分:55,信息:“否”}
};
常量键=Object.keys(mainObject);
const lowest=keys.map(key=>mainObject[key].totalScore.sort()[0];
const removed=键。reduce((结果,键)=>{
如果(mainObject[key].totalScore>lowest){
结果[键]=主对象[键];
}
返回结果;
},Object.create(null));
log(“没有得分最低的对象”);
控制台日志(已删除);
//编辑--或者,要保留关键点:
const removed2=键。reduce((结果,键)=>{
结果[key]=main对象[key]。总分>最低
?主对象[键]
:未定义;
返回结果;
},Object.create(null));
console.log(“保留所有钥匙”);

控制台日志(removed2)
// 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);
//对象
var mainObject={//它是未排序的,但无论如何都不需要排序
约翰:{总分:5,信息:“否”},
詹姆斯:{总分:3,信息:“否”},
李:{总分:55,信息:“否”}
}
//排列
var数组=[];
for(主对象中的变量i)
push({key:i,score:mainObject[i].totalScore});
//分类
sort(函数(a,b){返回a.score对于(var i=0;iYou无法对对象进行排序…我知道,您无法使用Array.prototype.sort()对其进行排序但是,可能有一种通过循环或其他方法来实现我想要的操作。定义“擦除”。删除属性不会留下1000个对象。而且对象不是列表,也没有长度。为什么不将对象转换为数组,使用元素
{id:'john',totalScore:5}
,对其进行排序,获得除1000之外的所有顶部,并从原始对象中删除它们?canis minor,你能说明你的意思吗?你的函数将索引从最低到最高排序,我只需要删除最低的分数,而不必对有效分数进行排序…然后你就可以替换mainArray.sort(函数(a,b){返回b.totalScore-a.totalScore;});使用mainArray.sort(函数(a,b){返回a.totalScore-b.totalScore;});@RunningFromShia您希望如何准确地识别哪些分数是最低分数而不进行排序?这并不能回答OP的问题。您的代码筛选分数大于50的人,而不是他想要的。假设,如果列表中的人的分数只有50分以上……那么筛选器什么也不做。do您计划删除属性,但仍保留1000个?这没有任何意义。如果是这样的话,您的问题中似乎缺少关键上下文。因为在服务器上,mainObject中有数千个对象,我的3个对象只是一个示例。如您在问题中所说,删除属性将删除它,给您留下更少的属性。有关保留所有键的信息,请参见编辑。