Javascript JS-删除对象列表中不必要的对象
我的节点服务器中有一个对象,它包含数千个对象,每个对象都是一个人,他有一个totalScore。 它看起来像这样: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"} } 现在,我想在
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)根据注释对进行编码-从初始对象创建一个数组,您可以对该数组进行排序,然后获取除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);
//对象
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个对象只是一个示例。如您在问题中所说,删除属性将删除它,给您留下更少的属性。有关保留所有键的信息,请参见编辑。