JavaScript/jQuery比较数组中的项
我试图做的是比较数组中的项目,以确定谁先被列出,为简单起见,在我看来,所有的个人数据都存储在同一个位置。我不知道分离这些数据是更容易还是更有效 这是数组,为了可读性缩小了JavaScript/jQuery比较数组中的项,javascript,jquery,html,arrays,Javascript,Jquery,Html,Arrays,我试图做的是比较数组中的项目,以确定谁先被列出,为简单起见,在我看来,所有的个人数据都存储在同一个位置。我不知道分离这些数据是更容易还是更有效 这是数组,为了可读性缩小了 var People = [{ "Name": "Person1", "SN": "1", "First": "5", "Second": "6", "Third": "11", "Fourth": "7", "Fifth": "8", "Sixth": "1",
var People = [{
"Name": "Person1",
"SN": "1",
"First": "5",
"Second": "6",
"Third": "11",
"Fourth": "7",
"Fifth": "8",
"Sixth": "1",
"Seventh": "10",
"Eigth": "4",
"Ninth": "3",
"Tenth": "2",
"Eleventh": "13",
"Twelth": "9",
"Thirteenth": "12",
"RDO1": 2,
"RDO2": 3
}, {
"Name": "Person2",
"SN": "2",
"First": "6",
"Second": "5",
"Third": "10",
"Fourth": "9",
"Fifth": "7",
"Sixth": "8",
"Seventh": "1",
"Eigth": "4",
"Ninth": "3",
"Tenth": "2",
"Eleventh": "13",
"Twelth": "11",
"Thirteenth": "12",
"RDO1": 2,
"RDO2": 3
}, {
"Name": "Person3",
"SN": "3",
"First": "6",
"Second": "9",
"Third": "7",
"Fourth": "10",
"Fifth": "8",
"Sixth": "5",
"Seventh": "4",
"Eigth": "2",
"Ninth": "3",
"Tenth": "13",
"Eleventh": "11",
"Twelth": "12",
"Thirteenth": "1",
"RDO1": 4,
"RDO2": 5
}];
我尝试了一系列嵌套的if,for循环,以及相互循环的函数,但都没有成功
因此,我试图实现的是,它将获取第一个选择,并与阵列中的其他人进行比较,如果其他人有相同的第一个选择,它将比较序列号,以查看两者中较低的一个
因此,在上面的数组中,当代码到达Person3并将6视为第一选择时,它会查看是否有其他人将6视为第一选择,并注意Person2也选择了6。然后,它比较序列号,不给Person3 6,因为Person2的数字较低,所以它将Person3移到第二位,并再次执行相同的检查
我已经为此绞尽脑汁有一段时间了,如果有人能告诉我这件事,我将不胜感激
编辑-更多代码
}您可以根据需要调整以下功能。我实现了它,用每个选项和每个选项名称的获胜者填充对象:
var winners = {};
function getChoiceWinner(choiceName) {
for (var i = 0; i < People.length; i++) {
var choice = People[i][choiceName];
if(!winners[choiceName]) winners[choiceName] = {};
winners[choiceName][choice] = People[i];
for (var j = 0; j < People.length; j++) {
if (winners[choiceName][choice][choiceName] == People[j][choiceName]) {
winners[choiceName][choice] = People[j]["SN"] < winners[choiceName][choice]["SN"] ? People[j] : winners[choiceName][choice];
}
}
}
}
在做了一些你需要的工作后,我有了一个解决方案。。我想 输出有点凌乱,但由于数组将更大,因此将首先按SN对所有内容进行分组 这是小提琴,您可以测试它: 这与最后一个答案的区别在于,这是动态的。因此,基本上,您可以继续进入数组并对不同的属性进行排序 此外,如果您想更改属性,它的可维护性也会更高
因此,对于您需要的内容,请列出属性。。只需按顺序打印数组,您就可以先按顺序列出所有内容,然后按顺序列出所有内容。@Hintshigen在应用所有规则后,什么是desire output?您查看过该实用程序吗?@ozil所需的输出将是人名,然后是旁边列出的选项,但只有一个人可以有一个选项,所以两个人没有选择的余地displayed@urbz我没有,但现在看一下,谢谢,我也不知道预期结果是什么,但听起来你可以使用递归。谢谢,我可以稍微更改一下,以显示我正在查找的信息。我不认为这个解决方案是可能的,感谢您花时间。哇,这个也很好,感谢您花时间深入研究,它肯定会对扩展阵列有所帮助。如果我有资格投票给你,我会的。取而代之的是我的感谢!
var winners = {};
function getChoiceWinner(choiceName) {
for (var i = 0; i < People.length; i++) {
var choice = People[i][choiceName];
if(!winners[choiceName]) winners[choiceName] = {};
winners[choiceName][choice] = People[i];
for (var j = 0; j < People.length; j++) {
if (winners[choiceName][choice][choiceName] == People[j][choiceName]) {
winners[choiceName][choice] = People[j]["SN"] < winners[choiceName][choice]["SN"] ? People[j] : winners[choiceName][choice];
}
}
}
}
function groupBy( array , f )
{
var groups = {};
array.forEach( function( o )
{
var group = JSON.stringify( f(o) );
groups[group] = groups[group] || [];
groups[group].push( o );
});
return Object.keys(groups).map( function( group )
{
return groups[group];
})
}
var groupedByFirst = groupBy(People, function(item)
{
return [item.First];
});
var finalGrouping = new Array;
for (i = 0; i <= groupedByFirst.length-1; i++) {
var test = groupBy(groupedByFirst[i], function(item) {
return [item.SN]
});
finalGrouping.push(test);
}
console.log(finalGrouping)