如何比较对象中的数组,如果在某个位置上所有数组的值都为true,则返回它们的索引



我必须随机化可分解性数组,所以我有了这个,它运行得很好。

var members = [{
name: "Jack",
disponibility: new Array(8).fill(true)
},
{
name: "Mary",
disponibility: new Array(8).fill(true)
},
{
name: "Paula",
disponibility: new Array(8).fill(true)
},
{
name: "Oscar",
disponibility: new Array(8).fill(true)
},
];


var getRandomDisponibility = (() => {
var randomBoolean = () => Math.random() >= 0.5;
for (var i = 0; i < members.length; i++) {
for (var x = 0; x < members[i].disponibility.length; x++) {
var saveboolean = randomBoolean()
members[i].disponibility[x] = saveboolean;
}
}
return members;
})()
console.log(members)

但现在我需要比较得到的四个数组,如果在一个位置,它们都返回true,那么就得到该位置的索引。我尝试了不同的方法和循环,但无法获得一致的结果:(

我已经搜索了论坛,但我找不到一个真正适合我的答案,如果重复的话,很抱歉。

如果disponibilities的长度相同,那么很容易实现:只需交换循环嵌入彼此的顺序:

var members = [{
name: "Jack",
disponibility: new Array(8).fill(true)
},
{
name: "Mary",
disponibility: new Array(8).fill(true)
},
{
name: "Paula",
disponibility: new Array(8).fill(true)
},
{
name: "Oscar",
disponibility: new Array(8).fill(true)
},
];
{
let randomBoolean = () => Math.random() >= 0.5;
for (var i = 0; i < members.length; i++) {
for (var x = 0; x < members[i].disponibility.length; x++) {
var saveboolean = randomBoolean()
members[i].disponibility[x] = saveboolean;
}
}
}
const findCommonDisponibility = (members, disponibilityLength) => {
for(let i = 0; i < disponibilityLength; i++){
if(members.every(({disponibility}) => disponibility[i]))
return i
}
return -1
}
console.log(members)
console.log(findCommonDisponibility(members, members[0].disponibility.length))

尝试这个

var members = [{
name: "Jack",
disponibility: new Array(8).fill(true)
},
{
name: "Mary",
disponibility: new Array(8).fill(true)
},
{
name: "Paula",
disponibility: new Array(8).fill(true)
},
{
name: "Oscar",
disponibility: new Array(8).fill(true)
},
];


var getRandomDisponibility = (() => {
var randomBoolean = () => Math.random() >= 0.5;
for (var i = 0; i < members.length; i++) {
for (var x = 0; x < members[i].disponibility.length; x++) {
var saveboolean = randomBoolean()
members[i].disponibility[x] = saveboolean;
}
}
return members;
})()
console.log(getRandomDisponibility);
//compare
var output = new Array(8).fill(true);
for (var j = 0 ; j<8 ;j++){
for (var i = 0 ; i<getRandomDisponibility.length;  i++){

output[j] = output[j] && getRandomDisponibility[i].disponibility[j];
}
if( output[j]) console.log('are all true on [' + j +']!!')
}
console.log(output);

这里有一个解决方案,您可以跟踪所有匹配的不确定性。

var members = [{
name: "Jack",
disponibility: new Array(8).fill(true)
},
{
name: "Mary",
disponibility: new Array(8).fill(true)
},
{
name: "Paula",
disponibility: new Array(8).fill(true)
},
{
name: "Oscar",
disponibility: new Array(8).fill(true)
},
];
// this is a shorter way to create random disponibility
function randomDisponibility(length) {
return new Array(length).fill().map(_ => Math.random() > .5);
}

var getRandomDisponibility = (() => {
var randomBoolean = () => Math.random() >= 0.5;
for (var i = 0; i < members.length; i++) {
for (var x = 0; x < members[i].disponibility.length; x++) {
var saveboolean = randomBoolean()
members[i].disponibility[x] = saveboolean;
}
}
return members;
})()

function matchingDisponibilities(members) {
// create an array like [0, 1, 2, 3, …]
const match = new Array(members[0].disponibility.length).fill().map((_,i) => i);

// filter this array and only keep indexes when all disponibilities are true. If there is no matching disponibility returns an empty array
return match.filter(i => members.every(member => member.disponibility[i]));
}
console.log(members, matchingDisponibilities(members))

最新更新