我有对象数组,其中包含带有字符串值的属性。我想要的是,要返回一个指示的Bool值,该数组包含不少于2个对象: -一个对象具有字符串属性,该属性的值等于“ foo” -一个对象具有字符串属性,该属性的值等于“ bar”
到目前为止,我只能通过“丑陋”的方法解决此问题:
!myArr.filter{ $0.property == "foo"}.isEmpty &&
!myArr.filter{ $0.property == "bar"}.isEmpty
有更好的方法吗?
以下是Playground中使用该方法的简单代码:
struct Obj {
var foo: String
}
let arr = [Obj(foo: "foo"), Obj(foo: "bar"), Obj(foo: "zoo")]
let result = !arr.filter{ $0.foo == "foo"}.isEmpty && !arr.filter{ $0.foo == "bar"}.isEmpty
print(result)
答案 0 :(得分:1)
const DragBox = styled.div(({ isVisible }: { isVisible }) =>
isVisible
? `
position: fixed;
display: flex;
border: 15px dashed white;
width: 100%;
height: 100%;
z-index: 2000;
top: 0;
left: 0;
right: 0;
bottom: 0;
flex: 1;
justify-content: center;
align-items: center;
text-align: center;
font-size: 30px;
font-weight: 600;
color: white;
letter-spacing: 1px;
margin: auto;
`
: 'display: none;'
);
const DropZone = ({ children }) => {
const [isVisible, setIsVisible] = useState(false);
const onDragEnter = useCallback((e) => {
setIsVisible(true);
e.stopPropagation();
e.preventDefault();
return false;
}, []);
const onDragOver = useCallback((e) => {
e.preventDefault();
e.stopPropagation();
return false;
}, []);
const onDragLeave = useCallback((e) => {
setIsVisible(false);
e.stopPropagation();
e.preventDefault();
return false;
}, []);
const onDrop = useCallback((e) => {
e.preventDefault();
const files = e.dataTransfer.files;
console.log('Files dropped: ', files);
// Upload files
setIsVisible(false);
return false;
}, []);
useEffect(() => {
window.addEventListener('mouseup', onDragLeave);
window.addEventListener('dragenter', onDragEnter);
window.addEventListener('dragover', onDragOver);
window.addEventListener('drop', onDrop);
return () => {
window.removeEventListener('mouseup', onDragLeave);
window.removeEventListener('dragenter', onDragEnter);
window.removeEventListener('dragover', onDragOver);
window.removeEventListener('drop', onDrop);
};
}, [onDragEnter, onDragLeave, onDragOver, onDrop]);
return (
<div>
{children}
<DragBox
className="bg-secondary"
isVisible={isVisible}
onDragLeave={onDragLeave}
>
Drop files to Upload
</DragBox>
</div>
);
};
答案 1 :(得分:-1)
@Larme是正确的,如果您考虑时间复杂度,则在使用filter
或contains
时,first
的最坏情况/最佳情况是 O(n)可以小于 O(n)或什至 O(1)
因此,这种情况的最佳选择是:
myArr.contains(where: {$0.propery == "foo"}) && myArr.contains(where: {$0.propery == "bar"})
或
((myArr.first(where: {$0.propery == "foo"}) != nil) && (myArr.first(where: {$0.propery == "bar"}) != nil)