Javascript Filter返回两个对象
Javascript Filter returning two objects
ers,我在这个算法上遇到了一些问题。
我正在使用Redux,尽管我认为这与这个问题并不相关。基本上,这段代码中的console.log语句只返回一个对象,正如它应该返回的那样,但函数A返回两个对象的数组(即使是函数C中没有通过测试的对象(
我把函数分为三个部分,看看这是否能帮助我修复它,但我仍然想不通。
有什么建议吗?
const A = (state) => {
// looks through an array and passes down a resource
return state.resources.locked.filter((resource) => {
return B(state, resource);
})
};
// looks through an array and passes down a building
const B = (state, resource) => {
return state.bonfire.allStructures.filter((building) => {
return C(building, resource);
})
};
// checks if building name and resource requirment are the same, and if building is unlocked
// then returns only that one
const C = (building, resource) => {
if (building.unlocked && building.name == resource.requires.structure) {
console.log(resource);
return resource;
}
}
当使用filter
时,请注意,传递给它的回调函数应该返回一个布尔值,指示是否需要过滤特定元素。
但在您的情况下,B
不返回布尔值,而是返回数组。即使该数组为空(表示没有资源匹配(,filter
也不会认为该值为false,因此相应的资源仍将出现在A
返回的数组中。
快速修复方法:获取B
返回的数组的长度,然后返回该长度。零将被视为错误:
const A = (state) => {
// looks through an array and passes down a resource
return state.resources.locked.filter((resource) => {
return B(state, resource).length; /// <---- length!
})
};
// looks through an array and passes down a building
const B = (state, resource) => {
return state.bonfire.allStructures.filter((building) => {
return C(building, resource);
})
};
// checks if building name and resource requirement are the same, and if building
// is unlocked and then returns only that one
const C = (building, resource) => {
if (building.unlocked && building.name == resource.requires.structure) {
return resource;
}
}
// Sample data. Only x matches.
var state = {
resources: {
locked: [{ // resource
requires: {
structure: 'x'
}
}, { // resource
requires: {
structure: 'y'
}
}]
},
bonfire: {
allStructures: [{ // building
unlocked: true,
name: 'x'
}, { // building
unlocked: true,
name: 'z'
}]
}
};
console.log(A(state));
但最好是在每个预期的地方都能真正返回布尔值。因此,C
应该只返回条件的结果,而B
可以使用some
而不是filter
,这不仅返回布尔值,而且一旦找到匹配,就停止进一步查找。在A
中,您现在可以拥有原始代码,因为您确实希望A
返回数据(而不是布尔值(。
还需要注意的是,对于只有一个计算表达式的箭头函数,可以使用快捷符号:
// looks through an array and passes down a resource
const A = state => state.resources.locked.filter( resource => B(state, resource) );
// looks through an array and passes down a building
// Use .some instead of .filter: it returns a boolean
const B = (state, resource) =>
state.bonfire.allStructures.some( building => C(building, resource) );
// checks if building name and resource requirment are the same, and if building
// is unlocked and then returns only that one
// Return boolean
const C = (building, resource) => building.unlocked
&& building.name == resource.requires.structure;
// Sample data. Only x matches.
var state = {
resources: {
locked: [{ // resource
requires: {
structure: 'x'
}
}, { // resource
requires: {
structure: 'y'
}
}]
},
bonfire: {
allStructures: [{ // building
unlocked: true,
name: 'x'
}, { // building
unlocked: true,
name: 'z'
}]
}
};
console.log(A(state));
相关文章:
- 正在更新mongod中两个对象内部的数组
- 添加两个对象以获取值的总和
- 如何使用javascript合并两个对象数组
- 在JavaScript中相等两个对象.在更改一时,秒会自动更改
- 如何使用AngularJs比较两个对象的JSON
- 如何在javascript中合并两个对象数组
- JavaScript - 合并两个对象数组并根据属性值删除重复数据
- Javascript如何确定两个对象是否相同
- 比较两个对象数组
- Javascript tests - 如何比较 Jasmine 中的两个对象
- JavaScript:为什么 array.push() 附加两个对象而不是一个对象
- 两个对象相等,但 js 确实说假
- 两个对象之间的Javascript原型
- 使用angularjs或javascript的两个对象数组的交集
- 合并两个对象而不覆盖
- 如何获取具有相同值的两个对象,并将其视为一个对象
- 比较两个对象数组中的重复对象,并在其'这在JavaScript中不是重复的
- 比较underscorejs中的两个对象数组
- 查找/合并具有共同属性的两个对象
- 有没有一个lodash函数可以合并两个对象并删除其中一个对象的属性(如果它们没有)'不存在于另一个中