JavaScript:如果另一个对象在另一个属性中具有相同的值,则更改对象值

JavaScript:如果另一个对象在另一个属性中具有相同的值,则更改对象值,javascript,arrays,sorting,object,javascript-objects,Javascript,Arrays,Sorting,Object,Javascript Objects,我有一个属性为name、pref和table的对象数组。我需要检查一个对象的pref值是否与任何其他对象的name值相同。我已经写了一些代码,但似乎不起作用 功能座椅(){ 对于(变量i=0;i acc.set(person.name,Object.assign(person{ id:我, 组:空 })),新地图); 常量组=[]; const free=新集合(hash.values()); while(自由大小){ 常量组=新集合(); 让person=free.values().next

我有一个属性为name、pref和table的对象数组。我需要检查一个对象的pref值是否与任何其他对象的name值相同。我已经写了一些代码,但似乎不起作用

功能座椅(){
对于(变量i=0;i{
设i=Math.floor(Math.random()*counts.length);
obj.table='table'+计数[i][0];
如果(--计数[i][1]==0)计数,则拼接(i,1);
})
}
随机化(1,4);
控制台日志(数据);
console.log(“就在这里^”);
};
};
风险值数据=[{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
{
姓名:“,
序言:“,
表:“”
},
];

座椅()您可以将朋友分配到同一组:如果任何人的首选联系人在现有组中,他们将被添加到同一组中,等等。通过这种方式,您可以将所有联系人分组到不同的组中,确保没有从一个组中的联系人到另一个组中的联系人的偏好链

然后,您可以按大小降序对这些组进行排序。首先考虑最大的组,您可以将它们分配到仍有空间容纳整个组的第一张桌子

如果有一组人不能坐在任何一张桌子上,你应该放弃,因为这意味着(在你的4张桌子和6个座位的配置中)没有办法让每个人都坐在他们喜欢的人旁边

下面是一个函数。我添加了代码,使代码段与输入一起工作,但其本质在于第一个函数:

功能座椅(数据){
//按姓名键入人员并添加一些额外属性
const hash=data.reduce((acc,person,i)=>
acc.set(person.name,Object.assign(person{
id:我,
组:空
})),新地图);
常量组=[];
const free=新集合(hash.values());
while(自由大小){
常量组=新集合();
让person=free.values().next().value;//集合中的第一个
//将首选项链添加到同一组
while(person&&person.group==null){
免费。删除(人);
组。添加(人);
person.group=组;
person=hash.get(person.pref);
}
如果(person&&person.group!==group){//合并组
groupforeach(p=>{
p、 组=人。组;
p、 加组(p);
});
}否则{
groups.push(group);//添加组
}
}
常量计数=[6,6,6,6];
groups.sort((a,b)=>b.size-a.size)//降序大小
.forEach(组=>{
让table=counts.findIndex(count=>count>=group.size);
如果(表==-1){
警报(“没有可能的解决方案”);
返回;
}
计数[表]-=组大小;
//分配表(表1、表2、表3或表4)
group.forEach(person=>person.table='table'+(table+1));
});
}
//下面是使演示正常工作的函数
(函数填充(){
const persons=[…数组(6*4).keys()];
//模板行:
常量$row=$('')。追加(
$('')。追加($(''),
$('')。追加(
$('').addClass('pref')
.append($(''),persons.map(函数(i){
返回$('').val(i+1).text('person'+(i+1));
}))
),
$('')。追加(
$('').addClass('表')
.append($(''),[1,2,3,4].map(函数(i){
返回$('').val('table'+i).text('table'+i);
}))
)
);
//用名字填表
$('table')。追加(
persons.map(i=>{
$tr=$row.clone();
$('input',$tr.val('person'+(i+1));
//删除选项以选择与首选人员相同的人员
$('.pref>option',$tr.get(i+1.remove();
返回$tr;
})
);
})(); // 立即执行
函数洗牌(a){
for(设i=a.length;i;i--){
设j=Math.floor(Math.random()*i);
[a[i-1],a[j]=[a[j],a[i-1]];
}
}
//允许为首选人员分配“随机”选择
$('rand#pref')。在('click',函数(){
const persons=[…数组(6*4).keys()];
洗牌(人);
$('tr')。